下面列出了代码。问题是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);
您很可能看到两个单独的http请求:一个是您显式发送的请求,另一个是浏览器为/favicon.ico
自动发送的请求。
每个响应的浏览器都在寻找一个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);