Node.js又一框架:Nest.js(四)

·  阅读 438
Node.js又一框架:Nest.js(四)

Request

Request:访问客户端的请求细节。

在处理函数的签名中使用 @Req() 装饰器,指示 Nest 将请求对象注入处理程序。

/**
* @description: 接收客户端请求参数的控制器示例
* @update: 2021-09-09 16:39:38
* @author: Ada.H
*/

// cats.controller.ts
import { Controller, Get, Req } from '@nest/common';

// 设置路由路径前缀 cats
@Controller('cats')
export class CatsController {
  // 接口方法 get 及接口路径独立部分 query
  @Get('query')
  findAll(@Req() request: Request): string {
    return '查询所有猫咪';
  }
}

// 接口路由:http://localhost:3000/cats/query
复制代码

Request 对象代表 HTTP 请求,并具有查询字符串,请求参数,HTTP 标头(HTTP hearder)和正文(HTTP body)的属性。在多数情况下,使用专用的装饰器即可。

Nest 提供的装饰器及其代表的底层平台特定对象的对照列表,如下:

装饰器底层平台特定对象
@Req()@Request()req
@Res()@Response()res
@Next()next
@Session()req.session
@Param(key?: string)req.params / req.params[key]
@Boby(key?: string)req.body / req.body[key]
@Query(key?: string)req.query / req.query[key]
@Headers(name?: string)req.headers / req.headers[name]
@Ip()req.ip
@HostParam()req.hosts

番外

使用类库特有的响应对象(Response)。

在请求处理函数中注入 @Res()@Response() 时,会将 Nest 置于该处理函数的特定于库模式下,并负责管理响应。此时,必须通过调用 response 对象发出某种响应(如:res.send(...)),否则 HTTP 服务器挂起。

// cats.controller.ts

import { Controller, Get, Post, Res, HttpStatus } from '@nestjs/common';
import { Response } from 'express';

@Controller('cats')
export class CatsController {
  @Post()
  create(@Res() res: Response) {
    res.status(HttpStatus.CREATED).send();
  }

  @Get()
  findAll(@Res() res: Response) {
    res.status(HttpStatus.OK).json([]);
  }
}
复制代码

谨慎使用此种方法:

  1. 代码变得依赖于平台:不同的底层库在响应对象(Response)上可能具有不同的 API
  2. 难以测试:须模拟响应对象等。
  3. 将失去依赖于 Nest 标准响应处理的 Nest 功能的兼容性(如:拦截器 Interceptors@HttpCode() / @Header() 装饰器)。虽然可以通过将 passthrough 选项设置为 true 来解决此问题,但相对多了些不必要的工作量。
    @Get()
    findAll(@Res({ passthrough: true }) res: Response) {
      res.status(HttpStatus.OK);
      return [];
    }
    复制代码
分类:
前端
标签:
分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改