第七章 Nest 装饰器

NestJS是一个基于Node.js的开发框架,它使用装饰器来增强应用程序的功能和可读性。装饰器是一种特殊的语法,可以附加元数据或修改类、方法、属性等的行为。

首先我们来创建一个新的项目:

nest new all-decorator -p npm

1717244394206.png

1、nest 最常用装饰器

  1. @Module():用于定义一个模块,并指定模块的元数据。
  2. @Controller():用于定义一个控制器,并标识其为一个控制器类。
  3. @Injectable():用于将一个类标记为可被注入的服务。
  4. @Inject():用于在服务类中注入其他依赖。
  5. @Global():用于将模块定义为全局模块,使得该模块中的提供者在整个应用程序中可见。
  6. @Catch():用于定义一个异常过滤器,用于捕获和处理应用程序中的异常。
  7. @UseFilters():用于将一个或多个异常过滤器应用于控制器或处理程序。
  8. @UseGuards():用于将一个或多个守卫应用于控制器或处理程序。
  9. @UseInterceptors():用于将一个或多个拦截器应用于控制器或处理程序。
  10. @UsePipes():用于将一个或多个管道应用于控制器或处理程序。

1、@Module

@Module() - 定义一个模块类,用于组织应用程序的不同部分。

可以看到我们新创建的项目就有一个模块
1717244587240.png
2、@Controller

@Controller() - 定义一个控制器类,用于处理HTTP请求

1717244744001.png
3、@Injectable

@Injectable() - 定义一个可注入的服务类,用于提供业务逻辑

1717244794592.png
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();
  }
}

1717245373525.png
5、@Global()

用于将模块定义为全局模块,使得该模块中的提供者在整个应用程序中可见。

nest generate resource qq

1717297475729.png

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 { }

1717297612443.png
我们在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,
    });
  }
}

1717298338074.png
接着我们使用这个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);
  }
}

1717298911819.png
访问 http://localhost:3000/qq
image.png
@UseGuards() @UseInterceptors() @UsePipes() 使用方法已与上面差不多

2、接口请求相关装饰器

以下NestJS 中常用的装饰器和参数装饰器,用于定义路由和处理请求的相关信息。

  1. @Get、@Post、@Put、@Delete、@Patch、@Options、@Head:用于定义路由处理程序的请求方法,分别对应 HTTP 的 GET、POST、PUT、DELETE、PATCH、OPTIONS、HEAD 方法。
  2. @Param:用于从路由参数中获取值,可以指定参数名称。
  3. @Query:用于从查询字符串中获取值,可以指定参数名称。
  4. @Body:用于从请求体中获取值,通常用于处理 POST 或 PUT 请求的请求体数据。
  5. @Headers:用于从请求头中获取值,可以指定请求头的名称。
  6. @Session:用于从会话中获取值,需要在应用程序中启用会话中间件。
  7. @HostParam:用于从主机参数中获取值,可以指定参数名称。
  8. @Req、@Request:用于获取请求对象。
  9. @Res、@Response:用于获取响应对象。
  10. @Next:用于获取下一个中间件函数。
  11. @HttpCode:用于设置响应的 HTTP 状态码。
  12. @Header:用于设置响应头。
  13. @Redirect:用于重定向到另一个路由。
  14. @Render:用于渲染模板并发送响应。
    1717299294361.png
    访问 http://localhost:3000/qq
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫ゞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值