自定义路线装饰器
自定义路线装饰器
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世界中,将属性附加到请求
对象是一种常见做法。然后,您必须每次在路径处理程序中手动抓取它们,例如,使用以下构造:
const user = req.user;
为了使其更具可读性和透明性,我们可以创建一个@User()
装饰器并在所有现有控制器中重复使用它。
user.decorator.ts
JS
import { createParamDecorator } from '@nestjs/common';
export const User = createParamDecorator((data, req) => {
return req.user;
}
然后,您可以在符合您要求的任何地方使用它。
JS
@Get()
async findOne(@User() user: UserEntity) {
console.log(user
}
传递数据
当装饰器的行为取决于某些条件时,您可以使用data
参数 将参数传递给装饰器的工厂函数。例如,下面的结构:
JS
@Get()
async findOne(@User('test') user: UserEntity) {
console.log(user
}
将test
通过data
参数访问字符串:
user.decorator.ts
JS
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
@Get()
async findOne(@User(new ValidationPipe()) user: UserEntity) {
console.log(user
}