正在加载,请稍候…

NestJS:使用依赖注入构建可扩展的 Node.js API

使用 NestJS 构建生产级 API——涵盖模块、依赖注入、守卫、拦截器、管道、自定义装饰器和 TypeORM。

NestJS:使用依赖注入构建可扩展的 Node.js API

NestJS 架构

控制器处理 HTTP 请求。服务处理业务逻辑。模块组织一切。

NestJS:使用依赖注入构建可扩展的 Node.js API 插图

控制器 + 服务 + 依赖注入

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

  @Get()
  @UseGuards(JwtAuthGuard)
  findAll() { return this.usersService.findAll() }

  @Post()
  @HttpCode(HttpStatus.CREATED)
  create(@Body() dto: CreateUserDto) { return this.usersService.create(dto) }

  @Get(':id')
  findOne(@Param('id', ParseIntPipe) id: number) { return this.usersService.findOne(id) }

  @Delete(':id')
  @UseGuards(JwtAuthGuard)
  remove(@Param('id', ParseIntPipe) id: number, @CurrentUser() user: User) {
    return this.usersService.remove(id, user.id)
  }
}

NestJS:使用依赖注入构建可扩展的 Node.js API 插图

DTO 验证

import { IsEmail, IsString, MinLength } from 'class-validator'
import { Transform } from 'class-transformer'

export class CreateUserDto {
  @IsEmail()
  @Transform(({ value }) => value.toLowerCase())
  email: string

  @IsString()
  @MinLength(8)
  password: string
}

// main.ts: 全局验证
app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true, forbidNonWhitelisted: true }))

NestJS:使用依赖注入构建可扩展的 Node.js API 插图

自定义装饰器

export const CurrentUser = createParamDecorator(
  (field: string, ctx: ExecutionContext) => {
    const req = ctx.switchToHttp().getRequest()
    return field ? req.user?.[field] : req.user
  }
)

响应拦截器

@Injectable()
export class ResponseInterceptor implements NestInterceptor {
  intercept(ctx: ExecutionContext, next: CallHandler) {
    return next.handle().pipe(
      map(data => ({ success: true, data, timestamp: new Date().toISOString() }))
    )
  }
}

-> 使用 JSON Viewer 格式化 API 响应。