NodeJS,Express和带外部请求的路由

时间:2015-03-12 13:22:24

标签: node.js express node-request

所以我目前正在构建一个用于学习的小型个人应用程序,我有一个场景,我将使用其他第三方的API,但有几个用于1个对象。例如,我有1个仪表板来呈现,我想对不同的地方进行不同的调用,并产生一个包含三个请求响应的数据对象。

例如,目前我有一些(类似于)下面的内容,它发出请求并返回该数据,以及find方法和当前用户会话中的其他数据。效果很好。

app.get('/profile', isLoggedIn, function(req, res) {
    Object.find().exec(function (err, records) {
        request('firstUrl', function(err, resp, body) {
            res.render('profile.ejs', {
                user : req.user,
                records : records,
                responseData : JSON.parse(body)
            });
        });
    });
});

但是现在我想提出超过1个请求......所以我不确定如何进行此操作以及最佳实践?

以下感觉它不会起作用和杂乱:

app.get('/profile', isLoggedIn, function(req, res) {
    Object.find().exec(function (err, records) {
        request('firstUrl', function(err, resp, body1) {
            request('secondUrl', function(err, resp, body2) {
                request('thirdUrl', function(err, resp, body3) {
                    res.render('profile.ejs', {
                        user : req.user,
                        records : records,
                        responseData1 : JSON.parse(body1),
                        responseData2 : JSON.parse(body2),
                        responseData3 : JSON.parse(body3)
                    });
                });             
            });
        });
    });
});

任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

您可能会发现async.js对于保持代码清除“回调地狱”非常有用。具体而言是parallelseries方法。

例如(未经测试):

async = require('async');

app.get('/profile', isLoggedIn, function(req, res) {
    async.parallel({
        records: function(callback) {
            Object.find().exec(function (err, records) {
                callback(null, records);
            });
        },
        responseData1: function(callback) {
            request('firstUrl', function(err, resp, body) {
                callback(null, JSON.parse(body));
            });
        }, 
        responseData2: function(callback) {
            request('firstUrl', function(err, resp, body) {
                callback(null, JSON.parse(body));
            });
        },
        responseData3: function(callback) {
            request('firstUrl', function(err, resp, body) {
                callback(null, JSON.parse(body));
            });
        },
    },
    function(err, results) {
        res.render('profile.ejs', {
            user : req.user,
            records : results.records,
            responseData1 : results.responseData1,
            responseData2 : results.responseData2,
            responseData3 : results.responseData3
        });
    });
});

parallel方法也可以使用一组函数而不是一个对象,这对你也很有用。看看at the documentation.

如果您打算使用请求获取可变数量的URL,则可能需要重构代码以使用async.js的队列或货物方法,而不是为要加载的每个URL重复相同的代码。 / p>