Nestjs 如何在来自会话 jwt req.user 的正文请求中注入值



我创建了一个"自定义装饰器",我用它来在正文中注入来自 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,因为它将在其余装饰器之前运行,从而允许您正确更新请求正文,以便它被@BodyValidationPipe自动拾取(我假设您正在使用,否则不会发生验证)。

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 );
}

最新更新