【问题标题】:collect socket returned result in socket.io在 socket.io 中收集套接字返回的结果
【发布时间】:2019-05-30 17:51:47
【问题描述】:

在 node.js (express.js) 中,我不能在端点中进行多次返回。

let result = {}
socket.on('receive_stream', ({data}) => {

  result = { 
     ...result,
     ...data,
  }
  // must I send it here? res.send(result)
})
res.send(result) //this is empty object

我如何等待并收集完成的流,然后只将result 发送给客户端?

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:
    let result = {}
    socket.on('receive_stream', ({data}) => {
    
      result = { 
         ...result,
         ...data,
      }
      // have to uncommented in case always opened socket     
     // res.send(result);
    })
    
    
    socket.on('end', () => {
      res.send(result);
     } );
    

    但是您可以使用JSON.stringify(result) 将您的对象转换为字符串,并且它仅在关闭套接字的情况下才有效。如果始终打开,则永远不会触发结束事件

    【讨论】:

    • 它是正确的。但通常套接字总是打开并且永远不会触发结束事件。在这种情况下,您应该从服务器发送流中的结束标志以指示发送数据的结束,并在“receive_stream”事件中处理它,并在收到结束标志时手动触发向客户端发送数据。一个“receive_stream”事件的发射并不总是从服务器接收到全部数据。
    • 顺便说一句,我们在项目中使用了 socket.io-client,它发出了带有始终打开套接字的整个数据的 socket.on('message', (data) => {}) 事件。可能您可以使用相同的套接字客户端/服务器
    【解决方案2】:

    您似乎有 2 个流。所以理论上你可以只管。

    socket.pipe(res);
    

    或者

    socket.on('receive_stream', data => res.emit('data', data));
    socket.on('end', data => res.emit('end'));
    

    【讨论】:

    • 不明白,是的,我在节点上有套接字客户端,在节点上也有另一个套接字服务器,但不在同一个端口。
    • 端口???你是说网口???没关系。 stream 是它下面的抽象。
    【解决方案3】:

    是的,在您的情况下,您必须在套接字回调中调用 req.send()

    但是有很多方法,问题在于您的代码结构设计模式,您应该阅读与“callback promise async await in javascript”相关的帖子

    【讨论】:

    • 对不起,可能是我没有解释清楚。我的想法是你应该将控制器的设计模式结构代码(句柄 req.send() )和套接字代码分开,因为我看到你把它们放在一个函数中。通常在我的项目中,当控制器的逻辑代码完成后,然后处理套接字。对不起,如果我误解了你的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    相关资源
    最近更新 更多