Nest核心概念
模块
模块是 Nest 应用的基本组织单元,用于将相关的控制器、服务、提供者等聚合在一起。每个模块通过 @Module
装饰器定义,便于应用的分层和功能划分。
ts
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
@Module({
controllers: [UsersController],
providers: [UsersService],
exports: [UsersService],
})
export class UsersModule {}
- controllers:用于声明本模块包含的控制器(Controller),控制器负责处理路由请求和响应,定义接口入口。
- imports:用于引入其他模块,便于在当前模块中复用其提供的服务或功能,实现模块间的解耦和依赖管理。
- providers:用于声明本模块的提供者(如服务Service、工具类等),这些提供者会被Nest的依赖注入系统管理,供控制器或其他提供者使用。
- exports:用于导出本模块中的部分提供者,使其可以被其他导入本模块的模块使用,实现功能共享。
简而言之:controllers 负责路由,imports 用于模块依赖,providers 提供服务逻辑,exports 用于服务共享。
路由
路由由控制器(Controller)负责,控制器用于处理传入的请求并返回响应。每个控制器通过装饰器(如 @Controller
、@Get
、@Post
等)定义路由路径和请求方法。
ts
import { Controller, Get, Param, Post, Body } from '@nestjs/common';
import { UsersService } from './users.service'
@Controller('users')
export class UsersController {
// 引入提供者
constructor(private readonly usersService: UsersService) {}
@Get()
findAll() {
return [{ id: 1, name: 'Alice' }];
}
@Get(':id')
findOne(@Param('id') id: string) {
return { id: Number(id), name: 'Alice' };
}
@Post()
create(@Body() dto: { name: string }) {
return { id: 2, ...dto };
}
}
提供者
提供者(Provider)是 Nest 依赖注入系统的核心,可以是服务(Service)、仓库、工厂等。通过 @Injectable
装饰器声明,提供者负责实现具体的业务逻辑或功能。
ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class UsersService {
private readonly users = new Map<number, { id: number; name: string }>();
findAll() {
return [...this.users.values()];
}
findOne(id: number) {
return this.users.get(id);
}
create(name: string) {
const id = this.users.size + 1;
const user = { id, name };
this.users.set(id, user);
return user;
}
}
// 在控制器中注入使用
// constructor(private readonly usersService: UsersService) {}
中间件
中间件(Middleware)用于在路由处理前对请求进行预处理,如日志记录、权限校验、请求体解析等。中间件可以应用于全局、模块或特定路由。
ts
import { Injectable, NestMiddleware, Module, MiddlewareConsumer, NestModule } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
import { UsersController } from './users.controller';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log(`${req.method} ${req.originalUrl}`);
next();
}
}
@Module({ controllers: [UsersController] })
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes('users');
}
}