Как заставить EventPattern работать в Nest JS - PullRequest
1 голос
/ 17 апреля 2019

Я устанавливаю базовый EventPattern между двумя экземплярами NestJS.Однако Событие не отправляется / не принимается другим Микросервисом.

Я попытался найти несколько конкретных примеров в документах, однако, похоже, что установка отличается от вызова clinet.emit / client.call для вызова других микросервисов.

Microservice 1.

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
import { Client, Transport, ClientProxy, ClientsModule, EventPattern } from '@nestjs/microservices';
import { Observable } from 'rxjs';


@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Client({ transport: Transport.REDIS })
  client: ClientProxy;

  @Get()
  async call(): Promise<number> {
    const pattern = { cmd: 'sum' };
    const payload = [1, 2, 3];
    const result = await this.client.emit('user_created', {age: 5});
    return this.client.send<number>(pattern, payload).toPromise();
  }


}

Микросервис два

import { Controller } from '@nestjs/common';
import { MessagePattern, EventPattern, Client, Transport, ClientProxy } from '@nestjs/microservices';

@Controller()
export class MathController {

  @Client({ transport: Transport.REDIS })
  client: ClientProxy;

  @MessagePattern({ cmd: 'sum' })
  sum(data: number[]): number {
    console.log('Message');
    return 1;
  }

  @EventPattern('user_created')
  async handleUserCreated(data: Record<string, unknown>) {
    console.log('EVENT');
    // business logic
  }
}

Когда мы звоним Microservice1.get клиенту, происходит вызов sum и Message печатается на Microservice 2.Однако ожидается, что EVENT будет напечатано и на Microservice 2.

1 Ответ

3 голосов
/ 16 мая 2019

У меня была такая же проблема при тестировании инфраструктуры, и я смог получить ожидаемый результат, добавив toPromise() к вызову emit.

Так что вы можете попробовать:

const result = await this.client.emit('user_created', {age: 5});.toPromise()

emit возвращает наблюдаемое, поэтому вы должны подписаться на него.Подойдет либо toPromise(), либо subscribe().

Для получения дополнительной информации: https://www.learnrxjs.io/concepts/rxjs-primer.html

...