Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use socket client with NestJs microservice

I started working with NestJs recently and got stock while trying to test my NestJs microservices app using a TCP client

Is it possible to trigger an @EventPattern or @MessagePattern() using a non-nest app?

When trying this method the the socket client just stuck on trying to connect.

Any ideas?

Thanks.

like image 894
Daniel Avatar asked Apr 11 '19 08:04

Daniel


1 Answers

Update Feb 2020

Since nest v6.6.0, it has become easier to integrate external services with a message de/serializer.
Have a look at the corresponding PR.


Original Answer

You have to set up the ports correctly to use it with nest:

The pattern you want to send is

<json-length>#{"pattern": <pattern-name>, "data": <your-data>[, "id": <message-id>]}

Example:

76#{"pattern":"sum","data":[0,3,3],"id":"ce51ebd3-32b1-4ae6-b7ef-e018126c4cc4"}

The parameter id is for @MessagePattern, without it @EventPattern will be triggered.

enter image description here

In your main.ts you setup the nest server. That's the port you want to send to from Packet Sender (enter at 1).

const app = await NestFactory.createMicroservice(AppModule, {
  transport: Transport.TCP,
  options: { host: 'localhost', port: 3005 },
  //                            ^^^^^^^^^^
});

Then you want your nest @Client to listen to messages coming from Packet Sender (see position 2 in image)

@Client({
  transport: Transport.TCP,
  options: { host: 'localhost', port: 52079 },
  //                            ^^^^^^^^^^^  
})
private client: ClientTCP;

Then connect your client:

async onModuleInit() {
  await this.client.connect();
}

and define a @MessagePattern:

@MessagePattern('sum')
sum(data: number[]): number {
  console.log(data);
  return data.reduce((a, b) => a + b, 0);
}

As you can see, in the example I'm sending [0,3,3] and nest correctly responds with the sum 6.

like image 123
Kim Kern Avatar answered Oct 16 '22 18:10

Kim Kern