我将数据从文件发送到服务器,作为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();
});
这是一个错误吗?这是预期的行为吗?我在创建请求或从文件中读取数据时做错了吗?
答案 0 :(得分:6)
这是预期的行为。
http://nodejs.org/api/stream.html#stream_event_end
事件:'结束'
当不再提供更多数据时,将触发此事件。
请注意,除非数据被完全消耗,否则不会触发结束事件。这可以通过切换到流动模式,或重复调用read()直到你结束来完成。
来自doc:
http://nodejs.org/api/http.html#http_http_request_options_callback
可选的回调参数将作为'response'事件的一次性监听器添加。
'响应'事件 http://nodejs.org/api/http.html#http_event_response
response参数将是http.IncomingMessage的一个实例。
http.IncomingMessage http://nodejs.org/api/http.html#http_http_incomingmessage
它实现了可读流接口。
可读流'结束'事件 http://nodejs.org/api/stream.html#stream_event_end