NodeJS、Express 和带有外部请求的路由

NodeJS, Express and routing with external requests

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

例如,目前我有一些(类似于)下面的东西,它发出请求和 returns 该数据,以及来自 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)
                    });
                });             
            });
        });
    });
});

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

您可能会找到 async.js to be useful in keeping your code clean from the "callback hell." Specifically the parallel or series 方法。

例如(未测试):

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 代码都相同。