【问题标题】:What is the correct way to stream an index page to a client?将索引页面流式传输到客户端的正确方法是什么?
【发布时间】:2012-03-26 20:36:46
【问题描述】:

在您在网络上找到的大多数示例中,index.html 文件的提供方式如下:

function serveIndexPage(response) {
  fs.readFile('__dirname + /public/index.html', function (err, data) {
      response.end(data);  
  });
};

这似乎是个坏主意,因为整个文件被读入内存然后发送到客户端。有没有更好的方法来做到这一点?我知道 Connect 和 Express 等库提供了这样的功能,但对于我的项目,我想使用普通的 node.js。

编辑

此外,您有时会看到 readFileSync 被使用,恕我直言,这更糟糕。

【问题讨论】:

  • 您可以使用fs.createReadStream(file).pipe(response),这可能会提高性能,但如果您担心这种性能,我建议您使用静态文件服务器或 CDN 来提供静态文件。
  • 管道是要走的路。我不同意 Linus 的观点。如果您提供较大的文件,您不希望所有内容都在内存中。
  • @Jan 你介意提供一个例子吗?
  • 发布了一个例子作为答案

标签: node.js


【解决方案1】:

通过管道传输您的数据,因此一个简单的静态 HTTP 服务器如下所示:

var Http = require('http'),
    Url = require('url'),
    Path = require('path'),
    Fs = require('fs');

Http.createServer(function(req, res) {
    var path = Url.parse(req.url).pathname;
    var file = Path.join(process.cwd(), path);

    path.exists(filename, function(exists) {
        if(!exists) {
            res.writeHead(404);
            res.end();
        }

        res.writeHead(200, /* mime type */);

        var fileStream = Fs.createReadStream(filename);
        fileStream.pipe(res);
    });
}).listen(process.env.PORT || 1999);

管道是类似的东西的简写

var s = Fs.createReadStream(filename);

s.on('data', function (data) {
    res.write(data);
});
s.on('end', function() {
    res.end();
});

【讨论】:

    【解决方案2】:

    理论上你可以逐行读取文件 response.write()'ing 每一行到客户端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      相关资源
      最近更新 更多