Nestjs如何在会话jwt req.user的主体请求中注入值

时间:2019-01-21 16:43:33

标签: typescript nestjs

我创建了一个“自定义装饰器”,并使用它向主体中插入请求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;
}

我该如何解决。 谢谢

2 个答案:

答案 0 :(得分:1)

请求装饰器不适合您尝试完成的工作,因为它们被设计用于从请求对象中检索信息,而不是对其进行突变。您应该改用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;
}

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