为什么响应已关闭而未完成?

时间:2015-01-15 08:04:40

标签: node.js

我在函数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事件,并且请求“卡住”,等待响应。

某些请求会成功的原因是什么,其他请求不会成功?

修改

我怎么知道为什么发生了近距离事件?它是客户端问题还是我的应用程序中的错误?

3 个答案:

答案 0 :(得分:2)

如果有finish那么它就是正常的,但是如果有close那么它可能是因为任何事情。在管道完成之前,我尝试在事件声明后面跟随代码。

1. `res.emit('close');`  And
2. `readStream.close();`

现在第一个显式发出close事件,第二个关闭管道传输的readStream。这两个语句都会触发res.on('close'),但我找不到close的原因。

我不能确定它是服务器错误还是客户端错误,但可能有以下原因:

  1. res.emit('close');明确发出了关闭事件。

  2. 管道来源出了问题。 (例如,在上述情况#2中,readStream已关闭)在这种情况下,它将比其他原因花费更长的时间。

  3. 响应发送开始后网络崩溃

  4. 客户端也可以触发关闭事件,如果它请求数据,然后客户端不存在则接收数据。

  5. 原因可能是任何事情,这使得答案无法完成。

答案 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

希望这有帮助。