为什么node.js http在没有数据监听器时不会调用end事件?

时间:2014-01-08 13:15:57

标签: node.js http

我将数据从文件发送到服务器,作为HTTP POST请求:

var options = {
    "hostname": "example.com",
    "port": 42,
    "path": "/whatever",
    "method": "PUT",
    "headers" : {
        // a few headers
    }
};

var req = http.request(options, function(res) {
    res.on("end", function () {
        console.log("The request is finished");
    });
});

var stream = fs.createReadStream("/tmp/someFile");

stream.on("data", function(data) {
    req.write(data);
});

stream.on("end", function() {
    req.end();
});

我正在收听res.on("end"),以便在上传文件后执行更多操作。

但是,在上面的示例中,永远不会调用res.on("end")

令人惊讶的是,当我为data事件添加一个监听器时,res.on("end")被可靠地调用。

如果我完全忽略下面示例中的数据,这甚至可以工作:

var options = {
    "hostname": "example.com",
    "port": 42,
    "path": "/whatever",
    "method": "PUT",
    "headers" : {
        // a few headers
    }
};

var req = http.request(options, function(res) {
    res.on("data", function () {
        /*
         * I don't even care for the data returned...
         */
    });

    res.on("end", function () {
        console.log("The request is finished");
    });
});

var stream = fs.createReadStream("/tmp/someFile");

stream.on("data", function(data) {
    req.write(data);
});

stream.on("end", function() {
    req.end();
});

这是一个错误吗?这是预期的行为吗?我在创建请求或从文件中读取数据时做错了吗?

1 个答案:

答案 0 :(得分:6)

这是预期的行为。

http://nodejs.org/api/stream.html#stream_event_end

  

事件:'结束'

     

当不再提供更多数据时,将触发此事件。

     

请注意,除非数据被完全消耗,否则不会触发结束事件。这可以通过切换到流动模式,或重复调用read()直到你结束来完成。

来自doc: