我创建了一个“自定义装饰器”,并使用它向主体中插入请求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;
}
我该如何解决。 谢谢
答案 0 :(得分:1)
请求装饰器不适合您尝试完成的工作,因为它们被设计用于从请求对象中检索信息,而不是对其进行突变。您应该改用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;
}
答案 1 :(得分:0)
代替
// 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 );
}