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 代码都相同。
所以我目前正在构建一个用于学习的小型个人应用程序,我有一个场景,我要使用其他第三方的 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 代码都相同。