2015-03-31 30 views
0

我的一个控制器正在抓取几百页的页面,其中它从页面中提取所有链接,并且当链接保存到数据库后,我正在使用afterCreate生命周期回调(下面是代码)如何使用异步模块的请求

afterCreate: function(createdLink, next) { 
     var request = require("request"); 
     var currentLink = config.apiUrl + "update/linkstatus?linkPath=" + createdLink.linkUrl; 
     request(currentLink, function(error, response, body) {                   
      console.log("saved", body); 
     }); 
     next(); 
    } 

这触发另一个控制器获取每个链接的状态;下面是该控制器的代码:

linkstatus: function(req, res) { 
    var request = require("request"); 
    var currentLink = req.query.linkPath; 
    request(currentLink, function(error, response, body) { 
      if(error) { 
        console.log(error); 
      } 
      var thisStatusCode = response.statusCode; 
      Link.update(
        {linkUrl: currentLink}, {statusCode: thisStatusCode} 
        ).exec(function(err, updatedLink) { 
        res.status(200).send(updatedLink); 
      }); 
    }); 
} 

的问题是,一些通话后,我开始收到以下错误:

TypeError: Cannot read property 'statusCode' of undefined 
    at Request._callback (/home/ubuntu/myapp/api/controllers/UpdateController.js:11 
2:32) 
    at self.callback (/home/ubuntu/myapp/node_modules/request/request.js:360:22) 
    at Request.emit (events.js:107:17) 
    at Request.onRequestError (/home/ubuntu/myapp/node_modules/request/request.js:1 

假设“linkstatus”控制器动作,我已经写没有正确地处理从1000个链接同时获取状态代码响应,并根据我的理解,我需要使用异步模块和承诺来解决这个问题,但我很难抓住回调和承诺的概念,所以对于在此获得输入

回答

1

您的问题是您无法保证响应,并且在前进之前请求在节点内部检查失败的情况下。

linkstatus: function(req, res, next) { 
    var request = require("request"); 
    var currentLink = req.query.linkPath; 
    request(currentLink, function(error, response, body) { 
      if(error || !response) { 
        console.log(error); 
      } 
      else { 
       var thisStatusCode = response.statusCode; 
       Link.update(
        {linkUrl: currentLink}, {statusCode: thisStatusCode} 
        ).exec(function(err, updatedLink) { 
        res.status(200).send(updatedLink); 
       }); 
      } 
    }); 
} 
+0

谢谢Meeker,这虽然好奇,但是有很多意义,如果某件事失败了,那么在成功完成请求之后,这个过程会再次回到它呢? – user3721307 2015-04-01 02:55:10

+0

您可以在代码中使用try/catch,或者如果使用像updatedBy这样的列来显示链接上次更新的时间,并在其超过X次时重新运行 – Meeker 2015-04-02 13:38:31