DTO не работает для микросервиса, но работает для apis напрямую - PullRequest
0 голосов
/ 04 июля 2019

Я разрабатываю apis & microservices в nestJS, это моя функция контроллера

    @Post()
    @MessagePattern({ service: TRANSACTION_SERVICE, msg: 'create' })
    create( @Body() createTransactionDto: TransactionDto_create ) : Promise<Transaction>{
        return this.transactionsService.create(createTransactionDto)
    }

когда я вызываю post api, проверка dto работает нормально, но когда я вызываю это с использованием проверки microservice, проверка не работает, и онапереходит на обслуживание без отклонения с ошибкой.Вот мой DTO

import { IsEmail, IsNotEmpty, IsString } from 'class-validator';
export class TransactionDto_create{
    @IsNotEmpty()
    action: string;

    // @IsString()
    readonly rec_id : string;

    @IsNotEmpty()
    readonly data : Object;

    extras : Object;
    // readonly extras2 : Object;
}

, когда я вызываю API без параметра действия, он показывает требуемое действие ошибки, но когда я вызываю это из микросервиса, используя

const pattern = {service: TRANSACTION_SERVICE,msg: 'create'};const data = {id: '5d1de5d787db5151903c80b9', дополнительные: {'asdf': 'dsf'}};

return this.client.send<number>(pattern, data)

не выдает ошибку и переходит в сервис.Я также добавил валидацию globalpipe.

app.useGlobalPipes(new ValidationPipe({
    disableErrorMessages: false,  // set true to hide detailed error message
    whitelist: false,  // set true to strip params which are not in DTO
    transform: false // set true if you want DTO to convert params to DTO class by default its false
  }));

как это будет работать как для API, так и для микросервисов, потому что мне нужно все в одном месте и с одинаковыми функциями, чтобы по каждому клиенту его можно было вызывать.

1 Ответ

0 голосов
/ 04 июля 2019

Я выхожу на конечность и предполагаю, что в вас main.ts у вас есть строка app.useGlobalPipes(new ValidationPipe());. Из документации

В случае гибридных приложений метод useGlobalPipes() не устанавливает каналы для шлюзов и микро-сервисов. Для «стандартных» (негибридных) приложений микросервиса useGlobalPipes() монтирует трубы глобально.

Вместо этого вы можете связать трубу глобально с AppModule, или вы можете использовать декоратор @UsePipes() на каждом маршруте, который будет нуждаться в проверке через ValidationPipe

Подробнее об обвязке труб здесь

...