Node.js错误:读取ECONNRESET。

3

我正在运行一个 Express 4 应用程序,并且我在路由器中添加了一些逻辑:

router.get('/pars', function(req, res, next) {

    fetcher.parseXml(function(err, result){ //download files from ftp server, it can takes from 10 sec to 1 minute
        if(err) {
            console.log("router " + err);
            res.render('index', { title: err });
        }else {
            console.log(result);
            res.render('index', { title: 'Download finish' });
        }
    });
});

并添加对应的按钮到起始索引页面,该按钮向“/pars”端点发送ajax请求:

...
<button id="btn">Parse Data</button>

  <script>
      $( document ).ready(function() {

          $('#btn').click(function () {
              $.get(
                      "/pars",
                      onAjaxSuccess
              );
          });
          function onAjaxSuccess(data) {
              alert(data);
          };
      });
</script>

所有东西都运行良好,我成功地重新加载了页面,并使用“jsftp”模块从FTP下载文件,但一段时间后(可能是30秒或2分钟),我遇到了错误,导致我的应用程序崩溃:

events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: read ECONNRESET
    at exports._errnoException (util.js:746:11)
    at TCP.onread (net.js:559:26)

我在Node.js ECONNRESET上找到了类似的问题。

我在我的app.js中添加了以下的代码来进行“捕获”:

process.on('uncaughtException', function (err) {
    console.error(err.stack);
    console.log("Node NOT Exiting...");
});

现在应用程序不会崩溃,但会不时地向我的日志中发送该错误信息的垃圾邮件,而所有逻辑都运行良好。

我认为问题可能出在ftp.get上:

 Ftp.get(config.get("ftpDownloader:dir") + '/'+ fileName, __dirname + '/xml/' + fileName, function(hadErr) {
        if (hadErr){
            log.error('There was an error retrieving the file.' + hadErr);
            ftpDonwloadCallback(hadErr);
        }else{
            log.info("XML WAS DOWNLOADED: " + fileName);
            readFile(fileName, ftpDonwloadCallback);
        }
    });

也许有人能帮助我解决这个问题?

2
理论上,当你从FTP下载文件完成后,连接本身仍然保持打开状态。然后,由于不活动而超时,服务器在一段时间后关闭此连接。在你完成FTP工作后,请尝试手动打开/关闭连接。或者,如果你确实需要长时间保持连接打开状态,请向FTP服务器发送一些“空闲”命令以防止连接关闭... - Alexander R.
1个回答

2

取决于错误信息:

events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: read ECONNRESET
    at exports._errnoException (util.js:746:11)
    at TCP.onread (net.js:559:26)

这是由TCP连接引起的。如果底层套接字接收到“错误”事件,但没有“错误”事件侦听器,则它将传播并导致进程崩溃。

检查您的HTTP服务器,并为其添加错误事件侦听器。

例如:

var server = http.createServer(function(request, response){ ... ... });

server.on('error', function(err) { ... ... });

如果您想捕获来自客户端的错误,可以监听“clientError”事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接