Nest JS中的Socket IO未收到确认

时间:2018-10-16 12:12:54

标签: node.js typescript nestjs

在使用nestjs框架的套接字io中,确认功能存在一些问题。

通常,使用下面的代码,data函数中的onStartSearch参数应包含数据和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")
        });
    }

1 个答案:

答案 0 :(得分:1)

如果仅返回纯数据,则将由nest自动调用确认(回调)功能:

@SubscribeMessage('startSearch')
async onStartSearch(socket, data) {
  if (Joi.validate(data, requestSchema).error) {
      return {
        status: 'error',
        reason: 'invalid params format',
      };
    }
}

但是您也可以不使用回调函数(例如,当使用不支持回调函数的本机套接字时):

@SubsribeMessage方法也可以返回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);
});