Skip to content

0到1使用Nest框架搭建后端服务

1. Nest.js 介绍

Nest.js 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架。它使用渐进式 JavaScript,使用 TypeScript 构建,并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式响应编程)的元素。

在底层,Nest.js 默认使用 Express.js,但也可以配置为使用 Fastify,这使得它与广泛的其他库完全兼容。

2. 核心优势

2.1 TypeScript 支持

  • 默认使用 TypeScript 开发,提供完整的类型系统
  • 更好的代码提示和错误检查
  • 面向对象编程的特性支持

2.2 模块化架构

  • 采用模块化设计,便于代码组织和维护
  • 每个功能模块都是独立的,可以方便地进行单元测试
  • 支持依赖注入,使代码更加解耦

2.3 完整的生态系统

  • 内置支持 WebSocket
  • 支持 GraphQL
  • 微服务支持
  • CLI 工具支持
  • 丰富的中间件

2.4 优秀的文档和社区支持

  • 完善的官方文档
  • 活跃的社区
  • 大量的最佳实践和示例

3. 入门指南

3.1 环境准备

首先确保你的机器上已经安装了 Node.js(建议版本 >= 12.x)。然后全局安装 Nest CLI:

bash
npm i -g @nestjs/cli

3.2 创建新项目

使用 Nest CLI 创建新项目:

bash
nest new project-name

3.3 项目结构

一个基本的 Nest.js 项目结构如下:

src/
├── app.controller.ts
├── app.module.ts
├── app.service.ts
└── main.ts
  • main.ts: 应用程序的入口文件
  • app.module.ts: 根模块文件
  • app.controller.ts: 基本控制器
  • app.service.ts: 基本服务

4. 实战案例:构建一个简单的用户管理 API

让我们创建一个简单的用户管理 API,包含基本的 CRUD 操作。

4.1 创建用户模块

typescript
// src/users/users.module.ts
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';

@Module({
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule {}

4.2 定义用户实体

typescript
// src/users/user.entity.ts
export class User {
  id: number;
  name: string;
  email: string;
  createdAt: Date;
}

4.3 创建用户服务

typescript
// src/users/users.service.ts
import { Injectable } from '@nestjs/common';
import { User } from './user.entity';

@Injectable()
export class UsersService {
  private users: User[] = [];

  create(user: Omit<User, 'id' | 'createdAt'>): User {
    const newUser = {
      id: Date.now(),
      ...user,
      createdAt: new Date(),
    };
    this.users.push(newUser);
    return newUser;
  }

  findAll(): User[] {
    return this.users;
  }

  findOne(id: number): User {
    return this.users.find(user => user.id === id);
  }

  update(id: number, updateUser: Partial<User>): User {
    const user = this.findOne(id);
    if (user) {
      Object.assign(user, updateUser);
    }
    return user;
  }

  remove(id: number): boolean {
    const index = this.users.findIndex(user => user.id === id);
    if (index !== -1) {
      this.users.splice(index, 1);
      return true;
    }
    return false;
  }
}

4.4 创建用户控制器

typescript
// src/users/users.controller.ts
import { Controller, Get, Post, Body, Param, Put, Delete } from '@nestjs/common';
import { UsersService } from './users.service';
import { User } from './user.entity';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Post()
  create(@Body() createUser: Omit<User, 'id' | 'createdAt'>) {
    return this.usersService.create(createUser);
  }

  @Get()
  findAll() {
    return this.usersService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.usersService.findOne(+id);
  }

  @Put(':id')
  update(@Param('id') id: string, @Body() updateUser: Partial<User>) {
    return this.usersService.update(+id, updateUser);
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.usersService.remove(+id);
  }
}

4.5 在主模块中注册用户模块

typescript
// src/app.module.ts
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module';

@Module({
  imports: [UsersModule],
})
export class AppModule {}

4.6 测试 API

启动应用:

bash
npm run start:dev

现在你可以使用 Postman 或 curl 测试以下接口:

bash

- 创建用户:POST http://localhost:3000/users
- 获取所有用户:GET http://localhost:3000/users
- 获取单个用户:GET http://localhost:3000/users/:id
- 更新用户:PUT http://localhost:3000/users/:id
- 删除用户:DELETE http://localhost:3000/users/:id

5. 总结

通过这个简单的示例,我们了解了 Nest.js 的基本使用方法:

  1. 使用装饰器定义控制器和路由
  2. 实现依赖注入
  3. 模块化组织代码
  4. 实现基本的 CRUD 操作

Nest.js 的强大之处远不止于此,它还支持:

  • 数据库集成(TypeORM, Mongoose 等)
  • 身份认证和授权
  • 文件上传
  • WebSocket
  • 微服务
  • 等等

建议在掌握基础后,进一步探索这些高级特性,以充分发挥 Nest.js 的潜力。

本站所有内容均为原创,转载请注明出处