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 アプリは送信するメッセージを検出し、メッセージを送信して同じメッセージを永遠に受信するという無限ループに陥ります。