nest js中的套接字io没有收到确认
Socket io in nest js not receiving acknowledgements
我在使用 nestjs
框架的套接字 io 中使用确认功能时遇到了一些问题。
通常,对于下面的代码,onStartSearch
函数中的 data
参数应该包含数据和 ack
函数以通知前端。但是数据参数只包含从前端发送的数据。
后端
@SubscribeMessage('startSearch')
async onStartSearch(socket, data) {
logger.info('User ' + socket.id + ' startedSearch');
logger.debug(data);
if (Joi.validate(data, requestSchema).error) {
return ack({
status: 'error',
reason: 'invalid params format',
});
}
前端
public sendMessage(payload: IChatMessage) {
this.socket.emit('message', payload, function(test) {
console.log("acckk received")
});
}
如果你只是return纯数据,nest会自动调用确认(回调)函数:
@SubscribeMessage('startSearch')
async onStartSearch(socket, data) {
if (Joi.validate(data, requestSchema).error) {
return {
status: 'error',
reason: 'invalid params format',
};
}
}
但您也可以在没有回调函数的情况下工作(例如,在使用不支持回调函数的本机套接字时):
@SubsribeMessage
方法也可以 return 和 Observable<WsResponse<any>>
。 WsResponse
包含事件名称和负载 {event: string, data: any}
。
@SubscribeMessage('startSearch')
async onStartSearch(socket, data): Observable<WsResponse<any>> {
if (Joi.validate(data, requestSchema).error)
return of({event: 'searchResponse', data});
}
然后只听您客户端的响应:
socket.on('searchResponse', function (data) {
console.log('event', data);
});
我在使用 nestjs
框架的套接字 io 中使用确认功能时遇到了一些问题。
通常,对于下面的代码,onStartSearch
函数中的 data
参数应该包含数据和 ack
函数以通知前端。但是数据参数只包含从前端发送的数据。
后端
@SubscribeMessage('startSearch')
async onStartSearch(socket, data) {
logger.info('User ' + socket.id + ' startedSearch');
logger.debug(data);
if (Joi.validate(data, requestSchema).error) {
return ack({
status: 'error',
reason: 'invalid params format',
});
}
前端
public sendMessage(payload: IChatMessage) {
this.socket.emit('message', payload, function(test) {
console.log("acckk received")
});
}
如果你只是return纯数据,nest会自动调用确认(回调)函数:
@SubscribeMessage('startSearch')
async onStartSearch(socket, data) {
if (Joi.validate(data, requestSchema).error) {
return {
status: 'error',
reason: 'invalid params format',
};
}
}
但您也可以在没有回调函数的情况下工作(例如,在使用不支持回调函数的本机套接字时):
@SubsribeMessage
方法也可以 return 和 Observable<WsResponse<any>>
。 WsResponse
包含事件名称和负载 {event: string, data: any}
。
@SubscribeMessage('startSearch')
async onStartSearch(socket, data): Observable<WsResponse<any>> {
if (Joi.validate(data, requestSchema).error)
return of({event: 'searchResponse', data});
}
然后只听您客户端的响应:
socket.on('searchResponse', function (data) {
console.log('event', data);
});