节点http res.end

时间:2014-12-16 16:48:15

标签: javascript node.js http

我目前正在阅读“Node.js in action”以及通过大量在线学习资源。本书的第一个示例之一是展示如何将流传输到响应。像这样:

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

http.createServer(function(req, res){
    res.writeHead(200, {"Content-Type": "image/png"});
    fs.createReadStream("./image.png").pipe(res);
}).listen(xxxx)

我的问题是这段代码的有效性如何?我的印象是,当你使用http时,你总是应该结束:

res.end();

这是不是必要的,因为它意味着结束?什么时候写回应我总是应该结束它?

2 个答案:

答案 0 :(得分:2)

当您的可读流完成读取(image.png文件)时,默认情况下会发出end()事件,这将在可写流上调用end()事件({{ 1}} stream)。在这种情况下,您不必担心调用res

值得指出的是,在这种情况下,调用end()事件后,res将不再可写。因此,如果您想让它保持可写,只需将end()选项传递给end: false,例如:

pipe()

,然后在将来的某个时间调用fs.createReadStream("./image.png").pipe(res, { end: false }); 事件。

答案 1 :(得分:0)

流不需要

end()。有一套很棒的教程here。其中一个练习(带有流的#11 http文件服务器)是创建一个静态文件服务器。这是代码的样子:

var fs = require('fs'),
    http = require('http'),
    port = parseInt( process.argv[2] ),
    file = process.argv[3],
    opts = { encoding:'utf8' },
    server;

server = http.createServer(function(req, res) {
    console.log( 'request url: ', req.url );

    res.writeHead(200, { 'Content-type':'text/plain' });
    var stream = fs.createReadStream( file );
    stream.pipe( res );

    stream.on('end', function() {
        console.log('stream ended...');
    });
});


server.listen( port, function() {
    console.log('server listening on port: ', port );
});

还有很多其他好的教程和例子。希望这会有所帮助。