Node.js是Http服务器,readstream结束事件触发console.log两次

时间:2014-11-12 17:20:03

标签: javascript node.js stream streaming

代码如下。问题是console.log()触发两次,表明rs.end正在触发两次,即使我只注册它一次。如果我注释掉res.end()它只会触发一次,所以我知道对res.end的调用导致rs.end也会触发,我只是不明白为什么。

我认识到这可能只是对事件系统或服务器流媒体对象的误解,我都没看过这些对象。

虽然它有点奇怪,但如果我将console.log更改为res.write以便将其写入浏览器,它只会将其写入浏览器一次,即使使用res.end()被召唤。

提前感谢您提供的任何帮助!

require('http').createServer(function(req, res) {

    var rs = require('fs').createReadStream('sample.txt');

    //Set the end option to false to prevent res.end() being automatically called when rs ends.
    rs.pipe(res, { end: false });

    rs.once('end', function() {
        console.log('Read stream completed');
        res.end();
    });

}).listen(8080);

2 个答案:

答案 0 :(得分:1)

您很可能会看到两个单独的http请求:您明确发送的请求以及浏览器为/favicon.ico自动发送的请求。

答案 1 :(得分:1)

每个响应的浏览器都在寻找一个favicon.ico,在这种情况下,因为你没有发送带有<link rel="icon" href="favicon.ico" type="image/x-icon"/>的html发送另一个请求,如果你试图避免它你可以这样做:

var http = require('http');
var fs = require('fs');
http.createServer(function(req, res) {
    var rs;
    if(req.url !== "/favicon.ico") {
        rs = fs.createReadStream('sample.txt');
        //Set the end option to false to prevent res.end() being automatically called when rs ends.
        rs.pipe(res, { end: false });

        rs.once('end', function() {
            console.log('Read stream completed');
            res.end();
        });
    } 
}).listen(3000);