【问题标题】:Socket io in nest js not receiving acknowledgements嵌套 js 中的套接字 io 未收到确认
【发布时间】:2018-10-18 21:29:33
【问题描述】:

我在使用nestjs 框架的socket 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")
        });
    }

【问题讨论】:

    标签: node.js typescript nestjs


    【解决方案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);
    });
    

    【讨论】:

      猜你喜欢
      • 2021-09-14
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 2021-04-24
      • 2022-09-28
      • 2021-12-24
      相关资源
      最近更新 更多