如何使用异步模块的请求

how to use request with async module

本文关键字:请求 模块 异步 何使用      更新时间:2023-09-26

我的一个控制器正在对100秒的页面进行爬网,其中它从页面中提取所有链接,当链接保存到数据库后,我使用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个链接中获取状态代码响应,根据我的理解,我需要使用异步模块和Promises来解决这个问题,但我很难理解回调和Promise的概念,所以在这个上获得输入将是非常棒的

您的问题是不能保证响应,在节点内部请求失败的情况下,您必须在继续之前进行检查。

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);
                });
           }
    });
}