我创建了一个"自定义装饰器",我用它来在正文中注入来自 jwt 会话用户的公司代码 (ZON_EMPRESA)。
// DECORATOR
import { createParamDecorator } from '@nestjs/common';
export const Zona = createParamDecorator((data, req) => {
req.body.ZON_EMPRESA = req.user.USU_EMPRESA;
return req.body;
});
验证在控制器中不起作用。如果我使用标准装饰器@Body () 验证正确。但是我无法向身体注入来自 jwt 会话的 req.user 的值ZON_EMPRESA
// CONTROLLER
@Put('')
async update( @Zona() body: IZona ) {
return await this.zonaonaService.update( body );
}
// VALIDATION
import { IsString, Length, IsInt, Min } from 'class-validator';
export class IZona {
readonly ZON_CODIGO?: number;
@IsInt()
@Min(1)
readonly ZON_EMPRESA: number;
@IsString()
@Length(5, 50)
readonly ZON_NOME: string;
@IsInt()
@Min(1)
readonly ZON_VENDEDOR: number;
}
我该如何解决这个问题。谢谢
请求装饰器不适合您要完成的任务,因为它们旨在从请求对象中检索信息,而不是用于改变它。您应该改用interceptor
,因为它将在其余装饰器之前运行,从而允许您正确更新请求正文,以便它被@Body
和ValidationPipe
自动拾取(我假设您正在使用,否则不会发生验证)。
import { ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class CompanyCodeInterceptor implements NestInterceptor {
intercept(
context: ExecutionContext,
call$: Observable<any>,
): Observable<any> {
const req = context.switchToHttp().getRequest();
req.body.ZON_EMPRESA = req.user.USU_EMPRESA;
return call$;
}
}
拦截器可以应用于方法、控制器或全局范围。例如,将其应用于控制器中的单个 HTTP 处理程序:
@Post()
@UseInterceptors(CompanyCodeInterceptor)
exampleHandler(@Body() model: IZona) {
// model is properly validated here, do whatever
return model;
}
而不是
// DECORATOR
import { createParamDecorator } from '@nestjs/common';
export const Zona = createParamDecorator((data, req) => {
req.body.ZON_EMPRESA = req.user.USU_EMPRESA;
return req.body;
});
在控制器中使用User
参数装饰器,从用户获取此信息,并将其传递给服务。
// DECORATOR
import { createParamDecorator } from '@nestjs/common';
export const User = createParamDecorator((data, req) => {
return req.user;
});
// CONTROLLER
@Put('')
async update( @User() user: IUser ) {
return await this.zonaonaService.update( user.USU_EMPRESA );
}