Nestjs项目实战 构建RESTful API服务指南

最近在学习Nestjs框架,准备用它来构建一个RESTful API服务。看了一些文档但实际开发中还是遇到几个问题:

  1. Nestjs的控制器和服务层应该如何合理划分?有没有最佳实践可以参考?
  2. 在实现JWT认证时,除了Passport策略外还需要注意哪些安全细节?
  3. 项目结构怎么组织比较规范?比如中间件、过滤器这些应该放在哪个目录?
  4. 文档说Nestjs支持TypeORM和Prisma,实际项目中更推荐用哪个?各有什么优缺点?
  5. 部署生产环境时,性能优化和错误监控有什么成熟的方案吗?
    希望能得到有实战经验的朋友指导,最好能结合具体代码示例说明!

3 回复

构建NestJS的RESTful API服务可分以下几步:

  1. 初始化项目:使用npm i -g @nestjs/cli安装Nest CLI,通过nest new project-name创建新项目。

  2. 创建模块:每个功能模块都应有自己的模块。例如nest generate module users生成users模块。

  3. 创建控制器:控制器处理HTTP请求。运行nest generate controller users,定义路由和方法如@Get()@Post()

  4. 创建服务:业务逻辑放于服务中。执行nest generate service users,注入服务到控制器。

  5. 定义DTO:利用class-validator库验证数据。可通过@IsString()等装饰器定义规则。

  6. 配置数据库:集成TypeORM或Mongoose连接数据库,定义实体模型。

  7. 启动服务:默认端口3000,运行npm run start:dev开启开发模式。

  8. 测试API:使用Postman或curl命令测试接口。

  9. 部署:生产环境需优化,如启用HTTPS、使用Docker容器化应用。

遵循REST原则,保持接口简洁,返回JSON格式数据,状态码明确表示操作结果。


构建NestJS的RESTful API服务可以按照以下步骤:

  1. 初始化项目:使用npm i -g @nestjs/cli安装CLI工具,然后运行nest new project-name创建项目。

  2. 定义模块和控制器:每个功能模块应有对应的模块(Module)和控制器(Controller)。例如,nest g mo modules/user生成用户模块,再用nest g co modules/user生成控制器。

  3. 创建服务:业务逻辑封装在服务中。通过nest g s services/user生成用户服务,并在服务中实现数据库操作等逻辑。

  4. 配置路由:在控制器中定义HTTP方法(GET、POST等)及路径,如@Get()@Post()装饰器,用于映射URL请求。

  5. 引入ORM(如TypeORM):配置数据库连接,生成实体类并操作数据库。通过npm install typeorm reflect-metadata mysql2添加依赖,并在app.module.ts中注册TypeORM。

  6. 验证与异常处理:利用内置的ValidationPipe进行数据校验,同时自定义全局异常过滤器来统一错误响应格式。

  7. 启动服务:运行npm run start:dev启动开发服务器,访问API接口进行测试。

  8. 部署上线:使用PM2管理进程或将应用打包为Docker镜像部署到服务器上。

遵循REST原则,确保资源以URI表示、使用标准HTTP方法以及返回恰当的状态码。

NestJS项目实战:构建RESTful API服务指南

基本步骤

  1. 项目初始化
npm i -g @nestjs/cli
nest new project-name
  1. 创建模块
nest generate module users
nest generate controller users
nest generate service users

核心功能实现

  1. 控制器示例(users.controller.ts)
import { Controller, Get, Post, Body, Param } from '@nestjs/common';
import { UsersService } from './users.service';
import { CreateUserDto } from './dto/create-user.dto';

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

  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    return this.usersService.create(createUserDto);
  }

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

  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.usersService.findOne(+id);
  }
}
  1. 服务层示例(users.service.ts)
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';

@Injectable()
export class UsersService {
  private users = [];
  
  create(createUserDto: CreateUserDto) {
    this.users.push(createUserDto);
    return createUserDto;
  }

  findAll() {
    return this.users;
  }

  findOne(id: number) {
    return this.users[id];
  }
}

进阶功能

  1. 使用DTO进行数据验证
import { IsString, IsEmail, IsNotEmpty } from 'class-validator';

export class CreateUserDto {
  @IsString()
  @IsNotEmpty()
  name: string;

  @IsEmail()
  email: string;
}
  1. 全局验证管道(main.ts)
import { ValidationPipe } from '@nestjs/common';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
  1. 数据库集成(使用TypeORM)
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;
}

最佳实践

  1. 遵循单一职责原则设计模块
  2. 使用DTO进行数据验证和转换
  3. 合理使用中间件和拦截器
  4. 编写单元测试和E2E测试
  5. 使用Swagger进行API文档化

通过以上步骤,您可以构建一个结构清晰、易于维护的RESTful API服务。

回到顶部