2012-03-26 26 views
0

在你的网络上找到的大多数例子中,index.html文件送达如下所示:什么是将索引页面流式传输到客户端的正确方法?

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

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

编辑

而且,你有时会看到使用readFileSync,这是恕我直言更糟。

+3

你可以使用'fs.createReadStream (file).pipe(response)'这可能会提高性能,但如果您担心这种性能,我建议您使用静态文件服务器或CDN来提供静态文件。 – 2012-03-26 10:54:18

+1

管道是要走的路。我不同意Linus tho。如果你服务更大的文件,你不想在内存中拥有所有的东西。 – 2012-03-26 12:30:01

+0

@Jan你介意提供一个例子吗? – helpermethod 2012-03-26 12:33:22

回答

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); 

的pipe'ing是简写形式,像

var s = Fs.createReadStream(filename); 

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

从理论上讲,你可以逐行读取文件line.write()将每一行都写入客户端。

相关问题