我在函数readFile
中的node.js中有以下代码:
res.setHeader("content-type", 'application/octet-stream');
res.setHeader("Content-Disposition", 'attachment; filename="' + 'original' + '"' + "; filename*=UTF-8''" + 'original' + "");
var readStream;
var exists = fs.existsSync(fullPath);
if (exists) {
callback(true);
readStream = fs.createReadStream(fullPath);
readStream.pipe(res);
} else {
callback(false);
return;
}
res.on('finish', function(){
logger.info('response ending');
readStream.close();
})
res.on('close', function(){
logger.info('response close');
readStream.close();
})
res.on('error', function(error){
logger.info(error);
readStream.close();
})
出于某种原因,某些请求会发出close
个事件,而其他请求则发出finish
。据我所知,当出现问题时会发出close
。
关闭事件可以在2秒到2分钟之间发射。在极少数情况下,不会发出close
和没有finish
事件,并且请求“卡住”,等待响应。
某些请求会成功的原因是什么,其他请求不会成功?
修改
我怎么知道为什么发生了近距离事件?它是客户端问题还是我的应用程序中的错误?
答案 0 :(得分:2)
如果有finish
那么它就是正常的,但是如果有close
那么它可能是因为任何事情。在管道完成之前,我尝试在事件声明后面跟随代码。
1. `res.emit('close');` And
2. `readStream.close();`
现在第一个显式发出close事件,第二个关闭管道传输的readStream。这两个语句都会触发res.on('close')
,但我找不到close
的原因。
我不能确定它是服务器错误还是客户端错误,但可能有以下原因:
res.emit('close');
明确发出了关闭事件。
管道来源出了问题。 (例如,在上述情况#2中,readStream已关闭)在这种情况下,它将比其他原因花费更长的时间。
响应发送开始后网络崩溃
客户端也可以触发关闭事件,如果它请求数据,然后客户端不存在则接收数据。
原因可能是任何事情,这使得答案无法完成。
答案 1 :(得分:1)
我认为这来自 HTTP协议本身。 keep-alive 有一个选项。如果使用了这个,那么连接可以重用于不同的请求。
你关闭了它,res.set("Connection", "close");
再次对它进行蚂蚁测试。
答案 2 :(得分:1)
我希望在调用close和finish事件时结束你的响应,而不是关闭readStream。
res.setHeader("content-type", 'application/octet-stream');
res.setHeader("Content-Disposition", 'attachment; filename="' + 'original' + '"' + "; filename*=UTF-8''" + 'original' + "");
var readStream;
var exists = fs.existsSync(fullPath);
if (exists) {
callback(true);
readStream = fs.createReadStream(fullPath);
readStream.pipe(res);
} else {
callback(false);
return;
}
res.on('finish', function(){
logger.info('response ending');
readStream.close(); // This closes the readStream not the response
res.end('FINISHED'); // Ends the response with the message FINISHED
})
res.on('close', function(){
logger.info('response close');
readStream.close(); // This closes the readStream not the response
res.end('CLOSED'); // Ends the response with the message CLOSED
})
res.on('error', function(error){
logger.info(error);
readStream.close(); // This closes the readStream not the response
res.end(error); // Ends the response with ERROR
})
由于您关闭了仅关闭readStream而不是响应的readStream,因此未关闭响应。要完成或结束回复,请使用res.end()
。
参考:http://nodejs.org/api/http.html#http_event_close_1 http://nodejs.org/api/http.html#http_response_end_data_encoding
希望这有帮助。