6

NestJS と NATS マイクロサービスを使用しようとしています。基本的なリクエスト/レスポンスを設定するための適切なドキュメントがあります。

私がしたことは次のとおりです。

ローカル NATS サーバーを実行しました。

main.tsサーバーに接続するようにmy をセットアップします。

async function bootstrap() {
  const app = await NestFactory.createMicroservice(AppModule, {
    options: {
      url: "nats://localhost:4222",
    },
    transport: Transport.NATS,
  });
  app.listen(() => console.log("Microservice is listening"));
}
bootstrap();

メッセージを送り返す ClientProxyFactory を作成しました。

export const NatsClientProvider: Provider = {
  inject: [ConfigService],
  provide: NatsClientProviderId,
  useFactory: async (config: ConfigService) =>
    ClientProxyFactory.create({
      options: {
        servers: config.getNatsConfig().servers,
      },
      transport: Transport.NATS,
    }),
};

app.controller.ts特定のパターンに応答するようにコントローラーをセットアップします。

@Controller()
export class AppController {
  constructor(
    private readonly appService: AppService,
    @Inject(NatsClientProviderId) private readonly natsClient: ClientProxy,
  ) {}

  @MessagePattern("hello")
  async getHello(data: string) {
    console.log("data: ", data);
    console.log("getHello!!");
    await this.natsClient.send("hello", this.appService.getHello());
    return this.appService.getHello();
  }

  async onModuleInit() {
    await this.natsClient.connect();
    console.log("Nats connected!");
  }

リクエスト/レスポンス メッセージの送信を試みるテスト ファイルを設定します。

import { connect } from "ts-nats";

async function start() {
  const nc = await connect({
    servers: ["nats://localhost:4222"],
  });

  const msg = await nc.request("hello", 5000, "me");
  console.log("msg: ", msg);
}

start();

Nest アプリを実行すると、NATS サーバー ログで正しく作成されたサブスクリプションを確認できます。

ファイルを実行するとtest.ts、 でタイムアウトしNatsError: Request timed out.ます。ただし、コンソール ログは表示されます (データはundefined、公開されたメッセージで指定しているにもかかわらずです。

returnメソッドもclient.sendメソッドも、アプリからメッセージを受信するために機能していません。

どんな助けでも大歓迎です!

編集:まだこの問題を調査しており、立ち往生しています。Microservice docsの「Sending Messages」セクションでは、「パターンは @MessagePattern() デコレーターで定義されたものと同じでなければなりませんが、ペイロードは別のマイクロサービスに送信したいメッセージです。」. 私がそうすると、Nest アプリは送信するメッセージを検出し、メッセージを送信して同じメッセージを永遠に受信するという無限ループに陥ります。

4

2 に答える 2