Nestjs Как я могу ввести значения в запросе тела из сеанса jwt req.user - PullRequest
0 голосов
/ 21 января 2019

Я создал «пользовательский декоратор» и использую его для введения в запросе тела кода компании (ZON_EMPRESA) от пользователя сеанса jwt.

// DECORATOR
import { createParamDecorator } from '@nestjs/common';
export const Zona = createParamDecorator((data, req) => {
    req.body.ZON_EMPRESA = req.user.USU_EMPRESA;
    return req.body;
});

Проверка не работает вконтроллер.Если я использую стандартный декоратор @Body () проверяет правильно.Но я не могу ввести тело со значением ZON_EMPRESA из req.user сессии jwt

// 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 голосов
/ 25 января 2019

Запрос Декораторы не подходят для того, что вы пытаетесь выполнить, так как они предназначены для получения информации из объекта запроса, а не для ее изменения. Вместо этого вы должны использовать 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;
}
0 голосов
/ 23 января 2019

вместо

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