使用Async& amp;请求包(NodeJS / Express)

时间:2017-06-12 20:07:33

标签: 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 });

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

谢谢。

1 个答案:

答案 0 :(得分:2)

RTFM的另一个案例。在每个函数中,您需要使用next()对象(或error)和要传递的值调用null

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

                    return next(null, unsPAM);
                };
                console.log(error);

                next(error);
            });
        },
        function(next) {
            request(queryString + 'end point string', function(error, response, body) {
                if (!error && response.statusCode == 200) {
                    var unsAll = JSON.parse(body);

                    return next(null, unsAll);
                };
                console.log(error);

                next(error);
            });
        }], 
        function(err, results) {
            res.render("api-results", [results]);
        });
    });

这将为您提供包含[unsPAM, unsAll]的数组。如果您想要一个对象,请使用:

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