【问题标题】:Multiple API calls with Async & Request Package (NodeJS / Express)使用异步和请求包(NodeJS / Express)进行多个 API 调用
【发布时间】:2017-11-14 10:17:06
【问题描述】:

我正在尝试在我的一个路由器中将异步和请求实现为异步 API 请求操作。终点只是一个查询字符串,我试图返回一个包含所有调用结果的数组或对象。到目前为止只有两个:

router.get('/', function(req, res) {
    async.parallel([
        function(next) {
            request(queryString + 'end point string', function(error, response, body) {
                if (!error && response.statusCode == 200) {
                    var unsPAM = JSON.parse(body);
                };
                console.log(error);
            });
        },
        function(next) {
            request(queryString + 'end point string', function(error, response, body) {
                if (!error && response.statusCode == 200) {
                    var unsAll = JSON.parse(body);
                };
                console.log(error);
            });
        }], 
        function(err, results) {
            res.render("api-results", [results]);
        });
    });

这正是我想要做的。如果我在请求后 console.log 每个变量的结果它可以正常工作,但没有返回任何内容并且我的 ejs 模板没有被提供。

我也尝试过以各种格式(数组/对象形式)使用类似下面的东西,但我似乎无法让它工作:

res.render("api-results", { unsPAM: unsPAM, unsAll: unsAll });

我认为这是因为请求的结果并没有以某种方式进入异步数组。任何建议/最佳实践解决方案/想法改变将不胜感激。

谢谢。

【问题讨论】:

    标签: node.js express asynchronous request


    【解决方案1】:

    在每个函数中,您需要使用null 和要传递的值调用next() 回调,如果不成功,则需要调用error 对象。没有它,async.parallel() 没有任何迹象表明 API 调用已经完成。

    为了减少重复代码的数量,您可以为每个 API 端点创建一个带有 URL 的闭包:

    function apiCall(url) {
        return function(callback) {
            request(url, function(error, response, body) {
                if (error || response.statusCode != 200) {
                    return callback(error);
                }
    
                try {
                    return callback(null, JSON.parse(body));
                } catch (error) {
                    return callback(error);
                }
            });
        };
    }       
    
    router.get('/', function(req, res) {
        async.parallel([
            apiCall(queryString + 'end point string'),
            apiCall(queryString + 'end point string')
        ], function(err, results) {
            if (err) console.log(err);
            res.render("api-results", results);
        });
    });
    

    这将调用res.render() 和results 作为[unsPAM, unsAll]。如果您希望 results 成为具有键 unsPAM 和 unsAll 的对象,请使用对象而不是数组作为第一个参数调用 async.parallel():

    router.get('/', function(req, res) {
        async.parallel({
            unsPAM: apiCall(queryString + 'end point string'),
            unsAll: apiCall(queryString + 'end point string')
        }, function(err, results) {
            if (err) console.log(err);
            res.render("api-results", results);
        });
    });
    

    【讨论】:

      猜你喜欢
      • 2018-03-05
      • 1970-01-01
      • 2017-11-15
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 2021-09-10
      • 2021-08-01
      相关资源
      最近更新 更多