typescript - Nestjs როგორ შემიძლია შევქმნა მნიშვნელობები body მოთხოვნაში session jwt req.user-დან


მე შევქმენი „სავარაუდო დეკორატორი“ და ვხმარობ მას, რომ Body მოთხოვნაში ჩავწერო კომპანიის კოდი (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 jwt სესიის req.user-დან

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

როგორ შემიძლია ამის გამოსწორება. გმადლობთ

პასუხი #1

ორების დეკორატორები არ არის კარგი გამოსავალი იმისთვის, რასაც შენ ცდილობ განახორციელო, რადგან ისინი შექმნილია ინფორმაციის მიღებისთვის Request ობიექტიდან, არა მის შესაცვლელად. შენ უნდა გამოიყენო interceptor მის ნაცვლად, რადგან ის იმოქმედებს დანარჩენ დეკორატორებზე ადრე, რაც შენს საშუალებას მოგცემს სწორად დააყენო Request-ის სხეული, რათა ის ავტომატურად შეირჩეს @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;
}

პასუხი #2

სათანაცვლოდ

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