I have a microservice in nest.js where I have a kafka consumer. I need that after my consumer listens for the new message in @MessagePatter (in controller), then it emits a socket event. I have a @WebSocketServer (), but if I inject my socket server into the controller this does not generate the message. Any ideas, how to issue a message with socket after receiving a message with kafka in nest.js?
My webSocket
import { SubscribeMessage, WebSocketGateway, OnGatewayInit, WebSocketServer, OnGatewayConnection, OnGatewayDisconnect, MessageBody, ConnectedSocket, } from '@nestjs/websockets'; import { Logger } from '@nestjs/common'; import { Socket, Server } from 'socket.io'; @WebSocketGateway(89, { transports: ['websocket'] }) export class EventsGatewayCon implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect { @WebSocketServer() server: Server; private logger: Logger = new Logger('EventsGateway'); @SubscribeMessage('testSocket') async testSocket( @ConnectedSocket() client: Socket, @MessageBody() payload: any, ): Promise<void> { console.log(payload); } afterInit(server: Server) { this.logger.log('Init'); } handleDisconnect(client: Socket) { this.logger.log(`Client disconnected: ${client.id}`); } handleConnection(client: Socket, ...args: any[]) { let theUid = null; if (client.handshake.query['isClient']) { theUid = client.handshake.query['uidClient']; this.server.sockets.emit('testSocket', 'new message'); client.join(theUid); this.logger.log(`Client connected: ${client.id}`); } }
Controller. Listen kafka messages
import { Controller } from '@nestjs/common';
import { MessagePattern, Payload } from '@nestjs/microservices';
import { AppService } from './app.service';
import { EventsGatewayCon } from './events/events.gateway';
@Controller()
export class AppController {
constructor(
private readonly appService: AppService,
private readonly event: EventsGatewayCon,
) {}
@MessagePattern('myListener') // Our topic name
async getTest(@Payload() message) {
console.log(message.value);
this.event.server.sockets.emit('testSocket', 'send new messa');
return 'I am ApiKafka'; //return the message but dont emit the message with socket
}
}
AppModule
import { Module } from '@nestjs/common'; import { EventsController } from './events.controller'; import { EventsGatewayCon } from './events.gateway'; @Module({ imports: [], controllers: [EventsController], providers: [EventsGatewayCon], exports: [EventsGatewayCon], }) export class EventsModule {}
Check your Kafka microservice implementation.
It should look like this:
main.ts
app.connectMicroservice({
transport: Transport.KAFKA,
options: {
client: {
clientId: 'KAFKA_CLIENT_ID',
brokers: ['KAFKA_URIS'],
},
},
});
await app.startAllMicroservices();
await app
.listen(port))
.then(() => {
Logger.log(`API Listen on ${port}`);
})
.catch((error: any) => Logger.error(error));
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.