Nestjs@Body()、@Params()、@Req()和@Res()的正确顺序是什么



我想访问res对象以发送httpOnlycookie,并且需要使用DTO验证主体。但每次我试着做的时候都会出问题,这些参数的正确顺序是什么?

没有需要遵循的严格顺序。每个控制器方法都可以使用decorator来检索不同的东西(请参阅控制器文档:https://docs.nestjs.com/controllers)

示例

假设您正在构建一个端点,用于使用POST请求和有效负载来处理某种搜索。Nest返回一些结果,并使用最近执行的搜索时间戳设置cookie。

这听起来像是你的要求,对吧?

将cookie解析器添加到嵌套应用程序

确保您遵循了cookie文档,并将所有依赖项安装在一起,并配置了cookie解析器中间件:https://docs.nestjs.com/techniques/cookies

搜索有效载荷数据传输对象(DTO(

import { IsInt, IsNotEmpty } from 'class-validator';
export class SearchBodyDto {
@IsNotEmpty()
searchPhrase: string;
@IsInt()
page = 1;
}

控制器方法

import { Request, Response } from 'express';
import { Body, Controller, Post, Req, Res } from '@nestjs/common';
@Controller()
export class AppController {
@Post('/search')
async search(
@Body() body: SearchBodyDto,
@Req() req: Request,
// passthrough:true here leaves response handling to framework.
// Otherwise you would need to send response manually, like: `res.json({data})`
@Res({ passthrough: true }) res: Response,
) {
const currentTimestamp = new Date().toISOString();
// Save to cookies current timestamp of search.
res.cookie('lastSearch', currentTimestamp, { httpOnly: true });
return {
// Return last search timestamp and fallback to current timestamp.
lastSearch: req.cookies.lastSearch ?? currentTimestamp,
// Validated search phrase from DTO.
searchPhrase: body.searchPhrase,
// Page by default 1.
page: body.page,
// Some example search results.
searchResults: ['water', 'wind', 'earth'],
};
}
}

结果

现在,当您向端点发出请求时,您将在响应中看到最新的搜索时间:poster示例,并且该值将设置为"lastSearch"cookie。

有效负载仍将使用DTO上的decorator进行验证。

不需要订单。

此外,它们是参数装饰器工厂,而不是参数。

相关内容

  • 没有找到相关文章

最新更新