Javascript Node.js:通过服务器响应发送流数据(无管道)

Javascript Node.js:通过服务器响应发送流数据(无管道),javascript,node.js,server,stream,Javascript,Node.js,Server,Stream,我希望通过将文件的多个部分作为块发送,而不是使用管道发送读取流。最终的目标是通过websocket实现,但我也想先把它写下来。我想知道如何有效地使用流数据、结束、关闭、可读事件。这是我的密码 const fs = require('fs'); const http = require('http'); const handler = (req, res) => { var stream = fs.createReadStream(req.url); stream.on('reada

我希望通过将文件的多个部分作为块发送,而不是使用管道发送读取流。最终的目标是通过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实现,但问题似乎在于我处理流的方式

编辑:我完成并测试了速度差。我得到管道:0.3秒,我的方法:0.1秒。要测试,请从这些fiddle复制javascript:vs

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

为什么??这正是当你用管道输送水流时发生的事情

最终目标是通过websocket实现

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

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

您的
可读性
很好。现在,您需要做的就是为
end
添加一个处理程序。大概是这样的:

stream.on('end', () => {
  res.end();
});
如果您只是通过管道传输数据流,这将自动为您的用户完成

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

为什么??这正是当你用管道输送水流时发生的事情

最终目标是通过websocket实现

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

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

您的
可读性
很好。现在,您需要做的就是为
end
添加一个处理程序。大概是这样的:

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

不过,如果您只是通过管道传输数据流,这将自动完成。

我可能想要一个headerand,我可能想要一个HeaderUpNote,用于阻止使用WebSocket进行数据流传输而支持HTTP流。WebSocket应该用于可序列化的数据,HTTP在处理数据流方面做得很好。我希望能够在数据发送时更好地处理数据。Pipe做得更慢。“数据流将被自动管理,以便目标可写流不会被更快的可读流淹没。”此外,使用websocket是我正在构建的应用程序的核心部分。我需要发送的不仅仅是每个请求的文件数据。我也需要发送身份验证。更重要的是请求的方法,如http、https或websocket。我也设置了使用http,但速度较慢。@Rey这根本不是真的。Node最新版本中的流是一些最优化的组件。不管怎样,您的所有写入操作都将进入缓冲区,因为在填充窗口之前,您只能通过TCP发送如此多的数据,因此无论您做什么,您都将受到网络和传输层的支配。至于身份验证,您应该像其他所有经过身份验证的web服务一样使用请求头数据来处理它。然后,如果身份验证失败,您可以适当地拒绝请求。不要在HTTP之上的WS之上重新发明HTTP状态代码。@即使您需要WebSocket,在升级到WebSocket之前,您仍然应该通过HTTP请求数据对连接进行身份验证。反对使用WebSocket进行数据流传输,赞成使用HTTP流。WebSocket应该用于可序列化的数据,HTTP在处理数据流方面做得很好。我希望能够在数据发送时更好地处理数据。Pipe做得更慢。“数据流将被自动管理,以便目标可写流不会被更快的可读流淹没。”此外,使用websocket是我正在构建的应用程序的核心部分。我需要发送的不仅仅是每个请求的文件数据。我也需要发送身份验证。更重要的是请求的方法,如http、https或websocket。我也设置了使用http,但速度较慢。@Rey这根本不是真的。Node最新版本中的流是一些最优化的组件。不管怎样,您的所有写入操作都将进入缓冲区,因为在填充窗口之前,您只能通过TCP发送如此多的数据,因此无论您做什么,您都将受到网络和传输层的支配。至于身份验证,您应该像其他所有经过身份验证的web服务一样使用请求头数据来处理它。然后,如果身份验证失败,您可以适当地拒绝请求。不要在HTTP之上的WS之上重新发明HTTP状态代码。@即使您需要WebSocket,在升级到WebSocket之前,您仍然应该通过HTTP请求数据对连接进行身份验证。