node.js - 使用异步和请求包进行多个 API 调用 (NodeJS/Express)

标签 node.js express asynchronous request

我正在尝试在我的路由器之一中将异步和请求实现为异步 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 });

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

谢谢。

最佳答案

在每个函数中,您需要使用 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()结果[unsPAM, unsAll]。如果您希望 results 是带有键 unsPAMunsAll 的对象,请使用对象而不是数组作为第一个参数调用 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);
    });
});

关于node.js - 使用异步和请求包进行多个 API 调用 (NodeJS/Express),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44507886/

相关文章:

javascript - 为什么在 node.js 9 中导出和导入错误?

node.js - 如何使用 ffmpeg、fluent-ffmpeg 和 express js 从视频中获取缩略图并将其作为响应发送

asynchronous - 如何在 Play 中将同步 Controller 重写为异步?

asynchronous - 如何使用消息队列设计多步骤流程?

javascript - 使用 Node 和 Express 4 使用 res.json 中的数据时出现非法 token

node.js - Passport.js 多个本地策略和 req.user

node.js - 将 API 数据与 MongoDB 数据结合起来

javascript - 扩展尚未创建的 javascript (nodeJS) 对象

javascript - 如何用Node和Express将图像从后端发送到 View ?

c# - 在导航之前取消等待方法的最佳方法?