首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

自定义路线装饰器

Nest是围绕称为装饰器的语言功能构建的。它是许多常用编程语言中的一个众所周知的概念,但在JavaScript世界中,它仍然相对较新。为了更好地理解装饰器的工作原理,您应该看看这篇文章。这是一个简单的定义:

ES2016装饰器是一个表达式,它返回一个函数,并可以将目标,名称和属性描述符作为参数。你可以通过在装饰器前面添加一个@字符并将其置于你想要装饰的顶部来应用它。可以为类或属性定义装饰器。

Nest提供了一组有用的param装饰器,您可以将它们与HTTP路由处理程序一起使用。下面是装饰器与普通快速对象的比较。

@Request()

req

@Response()

res

@Next()

next

@Session()

req.session

@Param(param?: string)

req.params?/?req.params[param]

@Body(param?: string)

req.body?/?req.body[param]

@Query(param?: string)

req.query?/?req.query[param]

@Headers(param?: string)

req.headers?/?req.headers[param]

此外,您可以创建自己的自定义装饰器。为什么它有用?

在node.js世界中,将属性附加到请求对象是一种常见做法。然后,您必须每次在路径处理程序中手动抓取它们,例如,使用以下构造:

代码语言:javascript
复制
const user = req.user;

为了使其更具可读性和透明性,我们可以创建一个@User()装饰器并在所有现有控制器中重复使用它。

user.decorator.ts

JS

代码语言:javascript
复制
import { createParamDecorator } from '@nestjs/common';

export const User = createParamDecorator((data, req) => {
  return req.user;
});

然后,您可以在符合您要求的任何地方使用它。

JS

代码语言:javascript
复制
@Get()
async findOne(@User() user: UserEntity) {
  console.log(user);
}

传递数据

当装饰器的行为取决于某些条件时,您可以使用data参数 将参数传递给装饰器的工厂函数。例如,下面的结构:

JS

代码语言:javascript
复制
@Get()
async findOne(@User('test') user: UserEntity) {
  console.log(user);
}

test通过data参数访问字符串:

user.decorator.ts

JS

代码语言:javascript
复制
import { createParamDecorator } from '@nestjs/common';

export const User = createParamDecorator((data, req) => {
  console.log(data); // test
  return req.user;
});

使用管道

Nest对待定制PARAM装饰以同样的方式为内置的那些(@Body()@Param()@Query())。这意味着也会为自定义注释参数执行管道(在我们的示例中为user参数)。此外,您可以将管道直接应用于自定义装饰器:

JS

代码语言:javascript
复制
@Get()
async findOne(@User(new ValidationPipe()) user: UserEntity) {
  console.log(user);
}

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com