node.js - 一枪流

标签 node.js

以下内容将无法正常工作:

var http = require('http');
var fs = require('fs');

var theIndex = fs.createReadStream('index.html');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    theIndex.pipe(res);
}).listen(9000);

它在第一个请求中效果很好,但对于所有后续请求,不会将 index.html 发送到客户端。 createReadStream 调用似乎需要位于 createServer 回调内部。我想我可以概念化为什么,但是你能用语言阐明为什么吗?似乎一旦流完成,文件句柄就会关闭,并且必须再次创建流?难道就不能简单地“重启”吗?这是正确的吗?

谢谢

最佳答案

流包含跟踪流状态的内部状态 - 对于文件流,您有 a file descriptor object , a read buffer ,和the current position the file has been read to 。因此,“倒回”Node.js 流是没有意义的,因为 Node.js 是一个异步环境——这是需要记住的重要一点,因为这意味着两个 HTTP 请求可能处于中间状态。同时处理。

如果一个 HTTP 请求导致流开始从磁盘进行流式传输,并且在流式传输过程中途出现另一个 HTTP 请求,则无法在第二个 HTTP 请求中使用相同的流(内部记录保存会错误地向第二个 HTTP 响应发送错误的数据)。同样,在处理第二个 HTTP 请求时倒回流将导致错误的数据发送到原始 HTTP 请求。

如果 Node.js 不是一个异步环境,并且可以保证流在回绕之前已完全用完,那么能够回绕流可能是有意义的(尽管有还需要考虑其他因素,例如 openendclose 事件的时间。

您确实可以访问low-level fs.read mechanisms ,因此理论上您可以创建一个仅打开单个文件描述符但生成多个流的 API;每个流将包含自己的缓冲区和读取位置,但共享一个文件描述符。也许是这样的:

var http = require('http');
var fs = require('fs');

var theIndexSpawner = createStreamSpawner('index.html');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    theIndexSpawner.spawnStream().pipe(res);
}).listen(9000);

当然,您必须弄清楚何时关闭文件描述符,确保您不会持有它太久等等。除非您发现多次打开文件是一个实际的瓶颈在您的应用程序中,这可能不值得花费精力。

关于node.js - 一枪流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18752086/

相关文章:

node.js - 如果 AWS Lambda 本地调用,如何在 Jest 测试中传递正确的 JSON 事件

node.js - 使用 WebSockets 和 NodeJs 集群

javascript - NightwatchJS "freezes"

javascript - 数据正在发送到我的数据库而无需发出请求

node.js - WebSocket 打开握手被取消

javascript - id 字段的 Mongoose 请求返回 id 和 _id

javascript - 如何将 SSL 证书添加到我现有的 node.js 服务器?

node.js - Windows 7 上的 npm install Restify 错误?

javascript - 如何将数据从 Node.js(webpack) 发送到纯 Node.js(express)?

node.js - postgres Heroku 中的 Knex 迁移 - 错误 : Unable to acquire connection