如何在http.get响应中处理未捕获的异常

时间:2013-01-18 05:52:54

标签: javascript node.js http-get uncaught-exception eventemitter

我有此代码使用API​​从第三方网站下载新闻Feed。它的设置每5秒运行一次,并提取可能发生的任何新闻事务。问题似乎是在没有新的交易发生时。

通过添加process.on('uncaught exception',function(error){console.log(“hmph”)})cron作业能够在5秒后继续,所以我很想离开它;但是,我添加了console.log(“hmph”),现在我很困惑。

第一次,控制台会写hmph。 5秒后它会写 哼 哼

等等。我知道我必须遗漏一些东西,但我不太确定它是什么。我已经尝试在else语句中执行request.end()但错误仍然会触发。

如果没有process.on('uncaught ...'),抛出的错误是:

  

events.js:71           抛出论点[1]; //未处理的'错误'事件                          ^   错误:解析错误       在Socket.socketOnData(http.js:1367:20)       在TCP.onread(net.js:403:27)

使用proccess.on('uncaught ...')console.log(错误)是:

  

{[错误:解析错误] bytesParsed:161,代码:'HPE_INVALID_CONSTANT'}

如何正确处理此错误?

缩写代码:

var job = new cronJob('*/5 * * * * *', function(){
  var request = http.get({
                            host: 'www.example.com',
                            path: '/news_feed?apicode=myapicode',
                            port: 80,
                            headers: { 'accept-encoding': 'gzip' } 
                         })

  request.on('response', function(response){
    if (response.statusCode == 200){
      // gunzip response, save response to mongodb
    } 
    else
    {
      // here is where the error is occuring
      process.on('uncaughtException',function(error){
        console.log(error);
        console.log("hmph");
    }
  });
}, null, true);

1 个答案:

答案 0 :(得分:3)

每次发出请求时,都会绑定一个新的uncaughtException处理程序,因此当第一个请求发送时,绑定第一个请求,当它失败时会打印错误,然后在下一个请求请求,您添加另一个处理程序,当失败时,第一个和第二个处理程序都将运行。

检查错误,并在此处讨论有关此类错误的对话:https://github.com/joyent/node/issues/3354您连接的服务器似乎正在做一些奇怪的事情。最简单的解决方案可能是使用uncaughtException处理程序。也就是说,它不太理想,你不应该把它作为未来问题的一般解决方案。

var job = new cronJob('*/5 * * * * *', function(){
  var request = http.get({
    host: 'www.example.com',
    path: '/news_feed?apicode=myapicode',
    port: 80,
    headers: { 'accept-encoding': 'gzip' } 
  });
  request.on('response', function(response){
    if (response.statusCode == 200){
      // gunzip response, save response to mongodb
    }
  });
}, null, true);

process.on('uncaughtException',function(error){
  console.log(error);
  console.log("hmph");
});