🚀 NestJS 后端知识体系(完整版)
🧩 一、NestJS 是什么?
NestJS = Node.js + TypeScript + 依赖注入 + 模块化架构
它让 Node 后端从“脚本堆叠”变成了“工程体系”,
不再是 app.get('/user') 这种扁平代码,而是:
- 有模块(Module)
- 有控制器(Controller)
- 有服务层(Service)
- 有依赖注入(DI)
- 有守卫、中间件、拦截器等企业级机制
通俗说:
如果 Express 是“路边摊”,Nest 就是“餐厅厨房”,流程规范、模块清晰。
🧱 二、NestJS 核心结构
npx @nestjs/cli new backend
cd backend
pnpm run start:dev
创建后生成的项目结构:
src/
├── main.ts # 启动入口
├── app.module.ts # 根模块
├── app.controller.ts # 控制器(接收请求)
├── app.service.ts # 服务层(业务逻辑)
你可以这样理解这几个概念 👇
| 概念 | 作用 | 类比 |
|---|---|---|
| Module | 模块化组织代码 | 文件夹 / 功能区 |
| Controller | 定义路由入口 | 前端的 Router |
| Service | 负责业务逻辑和数据处理 | Vue/React 中的 composable / store |
| Provider | 可被注入的类(Service 属于 Provider) | 可复用服务 |
| main.ts | 启动程序 | Vue 的 createApp / ReactDOM.render |
⚙️ 三、核心文件讲解
1️⃣ 启动入口 main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
相当于创建并运行一个 HTTP 服务器(基于 Express 或 Fastify)。
2️⃣ 模块(Module)
模块是 Nest 的“分区概念”。
每个模块代表一个业务功能,比如 UserModule, AuthModule, PostModule。
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
@Module({
controllers: [UserController],
providers: [UserService],
})
export class UserModule {}
controllers 注册路由入口
providers 注册可注入的逻辑类
3️⃣ 控制器(Controller)
控制器负责接收 HTTP 请求并返回响应。
import { Controller, Get, Post, Body, Param } from '@nestjs/common';
import { UserService } from './user.service';
@Controller('user')
export class UserController {
constructor(private userService: UserService) {}
@Get()
findAll() {
return this.userService.findAll();
}
@Post()
create(@Body() dto: any) {
return this.userService.create(dto);
}
@Get(':id')
findOne(@Param('id') id: string) {
return this.userService.findOne(id);
}
}
4️⃣ 服务层(Service)
逻辑层(与数据库、外部 API、算法逻辑交互):
import { Injectable } from '@nestjs/common';
@Injectable()
export class UserService {
private users = [];
findAll() {
return this.users;
}
create(dto) {
this.users.push(dto);
return dto;
}
findOne(id: string) {
return this.users.find((u) => u.id === id);
}
}
@Injectable() 让这个类能被 Controller 注入使用。
🧠 四、核心装饰器(Decorators)
NestJS 以“装饰器”为核心,结构优雅:
| 装饰器 | 用途 | 示例 |
|---|---|---|
@Controller('user') | 定义路由前缀 | /user |
@Get() / @Post() | 定义请求方法 | /user/:id |
@Body() | 获取请求体 | POST body |
@Param() | 获取路径参数 | /user/:id |
@Query() | 获取查询参数 | /user?page=1 |
@Injectable() | 声明可被注入类 | 用于 Service |
@Module() | 定义模块 | 功能划分 |
@UseGuards() | 权限控制 | 守卫 |
@UseInterceptors() | 响应拦截 | 拦截器 |
@UsePipes() | 参数验证 | DTO 校验 |
🧩 五、进阶功能模块
1️⃣ DTO + 验证(class-validator)
定义参数类型与校验规则:
import { IsEmail, IsString } from 'class-validator';
export class CreateUserDto {
@IsString()
name: string;
@IsEmail()
email: string;
}
控制器中使用:
@Post()
create(@Body() dto: CreateUserDto) {
return this.userService.create(dto);
}
2️⃣ 中间件(Middleware)
类似 Express 的中间件:
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log(`[LOG] ${req.method} ${req.url}`);
next();
}
}
在模块中应用:
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
@Module({})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes('*');
}
}
3️⃣ 守卫(Guard)— 权限控制
判断请求是否允许通过:
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
const req = context.switchToHttp().getRequest();
return req.headers.authorization === 'Bearer valid-token';
}
}
应用到路由:
@UseGuards(AuthGuard)
@Get('profile')
getProfile() {
return { user: 'admin' };
}
4️⃣ 拦截器(Interceptor)
在请求前后做统一处理,比如日志、响应包装:
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { map } from 'rxjs/operators';
import { Observable } from 'rxjs';
@Injectable()
export class TransformInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next.handle().pipe(map((data) => ({ success: true, data })));
}
}
5️⃣ 异常过滤器(Filter)
捕获异常并自定义响应:
import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const res = ctx.getResponse();
const status = exception.getStatus();
res.status(status).json({
success: false,
message: exception.message,
});
}
}
🧮 六、数据库集成(Prisma / TypeORM / Mongoose)
以 Prisma 为例:
pnpm add @prisma/client
pnpm add -D prisma
npx prisma init
prisma/schema.prisma:
model User {
id Int @id @default(autoincrement())
name String
email String @unique
}
在 UserService 中:
import { PrismaClient } from '@prisma/client';
@Injectable()
export class UserService {
prisma = new PrismaClient();
findAll() {
return this.prisma.user.findMany();
}
}
🔒 七、认证与授权
@nestjs/jwt+passport-jwt- 登录时生成 token
- 守卫中验证 token
- 支持角色权限(RoleGuard)
⚡ 八、模块化架构推荐
src/
├── main.ts
├── app.module.ts
├── modules/
│ ├── user/
│ │ ├── user.controller.ts
│ │ ├── user.service.ts
│ │ ├── user.module.ts
│ ├── auth/
│ │ ├── auth.controller.ts
│ │ ├── auth.service.ts
│ │ ├── auth.module.ts
│
├── common/
│ ├── guards/
│ ├── interceptors/
│ ├── filters/
│ ├── pipes/
│
├── prisma/
│ ├── prisma.service.ts
🚧 九、常见扩展功能
| 功能 | 模块 |
|---|---|
| JWT 鉴权 | @nestjs/jwt |
| Swagger 文档 | @nestjs/swagger |
| ORM 支持 | TypeORM / Prisma |
| 文件上传 | @nestjs/platform-express |
| WebSocket | @nestjs/websockets |
| Redis 缓存 | @nestjs/cache-manager |
| 队列任务 | @nestjs/bull |
| 微服务 | @nestjs/microservices |
🏁 十、总结与建议
| 层级 | 关键职责 |
|---|---|
| Controller | 接收请求、路由定义 |
| Service | 核心业务逻辑 |
| Module | 模块化管理 |
| Guard | 权限认证 |
| Interceptor | 响应包装、日志处理 |
| Pipe | 参数验证 |
| Filter | 异常捕获 |
| Middleware | 请求预处理 |
🌟 NestJS 的最大魅力:
用前端思维(模块化 + 装饰器 + 注入)写后端代码,逻辑清晰、扩展轻松。
1124

被折叠的 条评论
为什么被折叠?



