在线文档教程

自定义路线装饰器

自定义路线装饰器

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 }