【问题标题】:Node.js: Sending stream data over server response(without pipe)Node.js:通过服务器响应发送流数据(无管道)
【发布时间】:2017-11-01 13:36:02
【问题描述】:

我想通过将文件的多个部分作为块发送来发送它,而不是使用管道发送读取流。最终目标是通过 websocket 完成,但我也想先把它搞定。我想知道如何有效地使用流数据、结束、关闭、可读事件。这是我的代码。

const fs = require('fs');
const http = require('http');
const handler = (req, res) => {
  var stream = fs.createReadStream(req.url);
  stream.on('readable', () => {res.send(stream.read());});
};
const server = http.createServer(handler);
server.listen(80);

再次,最终目标是通过 websocket 来完成,但问题似乎在于我处理流的方式。

EDIT:我完成并测试了速度差异。我得到了管道:0.3 秒和我的方法:0.1 秒。要测试从这些小提琴中复制 javascript:PipeMy Method

【问题讨论】:

  • 我可能想要一个标题

标签: javascript node.js server stream


【解决方案1】:

我想通过将文件的多个部分作为块发送来发送它,而不是使用管道发送读取流。

为什么?这正是您通过管道传输流时会发生的情况。

最终目标是通过 websocket 实现

为什么?如果只需要向一个方向发送数据,则不需要 WebSocket。接收端可以使用 Fetch API 或类似的。 HTTP 是相当强大的协议。在任何情况下,您也可以通过管道连接到 WebSocket 流。

我想知道如何使用流数据、结束、关闭、可读事件

你有readable 下来就好了。现在您需要做的就是为end 添加一个处理程序。像这样的:

stream.on('end', () => {
  res.end();
});

如果您只是通过管道传输流,这会自动为您完成。

【讨论】:

  • 赞成反对使用 WebSocket 进行数据流传输,支持 HTTP 流。 WebSockets 应该用于可序列化的数据,HTTP 在处理数据流方面做得很好。
  • 我希望能够更好地处理发送的数据。
  • 管道运行速度较慢。 “数据流将被自动管理,因此目标 Writable 流不会被更快的 Readable 流淹没。” link 同样使用 websocket 是我正在构建的应用程序的核心部分。我需要发送的不仅仅是每个请求的文件数据。我也需要发送身份验证。更重要的是请求的方法,如http、https或websocket。我也将它设置为使用 http,但速度较慢。
  • @Rey 这根本不是真的。最新版本的 Node 中的流是一些最优化的组件。无论如何,您所有的写入都只是进入缓冲区,因为在填满窗口之前您只能通过 TCP 发送这么多数据,所以无论您做什么,您都受网络和传输层的摆布。至于身份验证,您应该像其他所有经过身份验证的 Web 服务一样使用请求标头数据来处理它。然后,如果身份验证失败,您可以适当地拒绝该请求。不要在 HTTP 之上的 WS 之上重新发明 HTTP 状态代码。
  • @Rey 即使您需要 WebSocket,您仍然应该在升级到 WebSocket 之前通过 HTTP 请求数据对连接进行身份验证。
猜你喜欢
  • 1970-01-01
  • 2012-04-03
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多