Nestjs项目实战 构建RESTful API服务指南
最近在学习Nestjs框架,准备用它来构建一个RESTful API服务。看了一些文档但实际开发中还是遇到几个问题:
- Nestjs的控制器和服务层应该如何合理划分?有没有最佳实践可以参考?
- 在实现JWT认证时,除了Passport策略外还需要注意哪些安全细节?
- 项目结构怎么组织比较规范?比如中间件、过滤器这些应该放在哪个目录?
- 文档说Nestjs支持TypeORM和Prisma,实际项目中更推荐用哪个?各有什么优缺点?
- 部署生产环境时,性能优化和错误监控有什么成熟的方案吗?
希望能得到有实战经验的朋友指导,最好能结合具体代码示例说明!
构建NestJS的RESTful API服务可分以下几步:
-
初始化项目:使用
npm i -g @nestjs/cli
安装Nest CLI,通过nest new project-name
创建新项目。 -
创建模块:每个功能模块都应有自己的模块。例如
nest generate module users
生成users模块。 -
创建控制器:控制器处理HTTP请求。运行
nest generate controller users
,定义路由和方法如@Get()
、@Post()
。 -
创建服务:业务逻辑放于服务中。执行
nest generate service users
,注入服务到控制器。 -
定义DTO:利用
class-validator
库验证数据。可通过@IsString()
等装饰器定义规则。 -
配置数据库:集成TypeORM或Mongoose连接数据库,定义实体模型。
-
启动服务:默认端口3000,运行
npm run start:dev
开启开发模式。 -
测试API:使用Postman或curl命令测试接口。
-
部署:生产环境需优化,如启用HTTPS、使用Docker容器化应用。
遵循REST原则,保持接口简洁,返回JSON格式数据,状态码明确表示操作结果。
构建NestJS的RESTful API服务可以按照以下步骤:
-
初始化项目:使用
npm i -g @nestjs/cli
安装CLI工具,然后运行nest new project-name
创建项目。 -
定义模块和控制器:每个功能模块应有对应的模块(Module)和控制器(Controller)。例如,
nest g mo modules/user
生成用户模块,再用nest g co modules/user
生成控制器。 -
创建服务:业务逻辑封装在服务中。通过
nest g s services/user
生成用户服务,并在服务中实现数据库操作等逻辑。 -
配置路由:在控制器中定义HTTP方法(GET、POST等)及路径,如
@Get()
或@Post()
装饰器,用于映射URL请求。 -
引入ORM(如TypeORM):配置数据库连接,生成实体类并操作数据库。通过
npm install typeorm reflect-metadata mysql2
添加依赖,并在app.module.ts
中注册TypeORM。 -
验证与异常处理:利用内置的ValidationPipe进行数据校验,同时自定义全局异常过滤器来统一错误响应格式。
-
启动服务:运行
npm run start:dev
启动开发服务器,访问API接口进行测试。 -
部署上线:使用PM2管理进程或将应用打包为Docker镜像部署到服务器上。
遵循REST原则,确保资源以URI表示、使用标准HTTP方法以及返回恰当的状态码。
NestJS项目实战:构建RESTful API服务指南
基本步骤
- 项目初始化
npm i -g @nestjs/cli
nest new project-name
- 创建模块
nest generate module users
nest generate controller users
nest generate service users
核心功能实现
- 控制器示例(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);
}
}
- 服务层示例(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];
}
}
进阶功能
- 使用DTO进行数据验证
import { IsString, IsEmail, IsNotEmpty } from 'class-validator';
export class CreateUserDto {
@IsString()
@IsNotEmpty()
name: string;
@IsEmail()
email: string;
}
- 全局验证管道(main.ts)
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(3000);
}
- 数据库集成(使用TypeORM)
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
}
最佳实践
- 遵循单一职责原则设计模块
- 使用DTO进行数据验证和转换
- 合理使用中间件和拦截器
- 编写单元测试和E2E测试
- 使用Swagger进行API文档化
通过以上步骤,您可以构建一个结构清晰、易于维护的RESTful API服务。