NestJS是一个基于Node.js的开发框架,它使用装饰器来增强应用程序的功能和可读性。装饰器是一种特殊的语法,可以附加元数据或修改类、方法、属性等的行为。
首先我们来创建一个新的项目:
nest new all-decorator -p npm
1、nest 最常用装饰器
- @Module():用于定义一个模块,并指定模块的元数据。
- @Controller():用于定义一个控制器,并标识其为一个控制器类。
- @Injectable():用于将一个类标记为可被注入的服务。
- @Inject():用于在服务类中注入其他依赖。
- @Global():用于将模块定义为全局模块,使得该模块中的提供者在整个应用程序中可见。
- @Catch():用于定义一个异常过滤器,用于捕获和处理应用程序中的异常。
- @UseFilters():用于将一个或多个异常过滤器应用于控制器或处理程序。
- @UseGuards():用于将一个或多个守卫应用于控制器或处理程序。
- @UseInterceptors():用于将一个或多个拦截器应用于控制器或处理程序。
- @UsePipes():用于将一个或多个管道应用于控制器或处理程序。
1、@Module
@Module() - 定义一个模块类,用于组织应用程序的不同部分。
可以看到我们新创建的项目就有一个模块
2、@Controller
@Controller() - 定义一个控制器类,用于处理HTTP请求
3、@Injectable
@Injectable() - 定义一个可注入的服务类,用于提供业务逻辑
4、@Inject()
@Inject() - 用于在服务类中注入其他依赖
import { Controller, Get, Inject } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
// constructor(private readonly appService: AppService) {}
@Inject(AppService)
private readonly appService: AppService;
@Get()
getHello(): string {
return this.appService.getHello();
}
}
5、@Global()
用于将模块定义为全局模块,使得该模块中的提供者在整个应用程序中可见。
nest generate resource qq
import { Global, Module } from '@nestjs/common';
import { QqService } from './qq.service';
import { QqController } from './qq.controller';
@Global()
@Module({
controllers: [QqController],
providers: [QqService],
})
export class QqModule { }
我们在qq.module.ts 里增加 @Global() 之后 qq模块就变成全局了 可以在其他模块exports 的 provider 直接注入
6、@Catch() @UseFilters()
@Catch 是一个装饰器,用于捕获异步操作中发生的异常。它可以应用在类、方法或者参数上。
应用 @Catch 装饰器后,该装饰的类、方法或者参数将会成为一个异常过滤器。异常过滤器可以用来捕获并处理在控制器、服务或者中间件中发生的异常。
nest g filter qq --no-spec --flat
filter 是处理抛出的未捕获异常的,通过 @Catch 来指定处理的异常 qq.filter.ts:
import { ArgumentsHost, Catch, ExceptionFilter, HttpException } from '@nestjs/common';
import { Response } from 'express';
@Catch(HttpException)
export class QqFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const response: Response = host.switchToHttp().getResponse();
response.status(exception.getStatus()).json({
message: exception.message,
});
}
}
接着我们使用这个filter
import { Controller, Get, Post, Body, Patch, Param, Delete, UseFilters, HttpException, HttpStatus } from '@nestjs/common';
import { QqService } from './qq.service';
import { CreateQqDto } from './dto/create-qq.dto';
import { UpdateQqDto } from './dto/update-qq.dto';
import { QqFilter } from 'src/qq.filter';
@Controller('qq')
export class QqController {
constructor(private readonly qqService: QqService) { }
@Post()
create(@Body() createQqDto: CreateQqDto) {
return this.qqService.create(createQqDto);
}
@Get()
@UseFilters(QqFilter)
findAll() {
throw new HttpException('进入这个异常', HttpStatus.BAD_REQUEST)
return this.qqService.findAll();
}
@Get(':id')
findOne(@Param('id') id: string) {
return this.qqService.findOne(+id);
}
@Patch(':id')
update(@Param('id') id: string, @Body() updateQqDto: UpdateQqDto) {
return this.qqService.update(+id, updateQqDto);
}
@Delete(':id')
remove(@Param('id') id: string) {
return this.qqService.remove(+id);
}
}
访问 http://localhost:3000/qq
@UseGuards() @UseInterceptors() @UsePipes() 使用方法已与上面差不多
2、接口请求相关装饰器
以下NestJS 中常用的装饰器和参数装饰器,用于定义路由和处理请求的相关信息。
- @Get、@Post、@Put、@Delete、@Patch、@Options、@Head:用于定义路由处理程序的请求方法,分别对应 HTTP 的 GET、POST、PUT、DELETE、PATCH、OPTIONS、HEAD 方法。
- @Param:用于从路由参数中获取值,可以指定参数名称。
- @Query:用于从查询字符串中获取值,可以指定参数名称。
- @Body:用于从请求体中获取值,通常用于处理 POST 或 PUT 请求的请求体数据。
- @Headers:用于从请求头中获取值,可以指定请求头的名称。
- @Session:用于从会话中获取值,需要在应用程序中启用会话中间件。
- @HostParam:用于从主机参数中获取值,可以指定参数名称。
- @Req、@Request:用于获取请求对象。
- @Res、@Response:用于获取响应对象。
- @Next:用于获取下一个中间件函数。
- @HttpCode:用于设置响应的 HTTP 状态码。
- @Header:用于设置响应头。
- @Redirect:用于重定向到另一个路由。
- @Render:用于渲染模板并发送响应。
访问 http://localhost:3000/qq