我有一个Node js Express应用程序,我从许多不同的地方(服务器,Twitter,另一个数据库等)设置cookie。这些都需要连续发生。为了避免回调噩梦,我试图使用Async.js。但是,在async.series调用完成之前,响应会继续发送。如何确保async.series完成,然后调用res.redirect?
使用ASYNC调用模块
// OTHER CODE
accountCookies(req, res, next); // THE MODULE WITH ASYNC
res.redirect(302, 'https://' + req.host + '/account');
ASYNC MODULE
module.exports = function (req, res, next) {
req.appVariables.error = null;
// Required modules
var async = require(__dirname + '/utilities-----async.js'); // Utility for controlling node's asynchronous behavior
var userSessionObject = {};
// ...OTHER MODULES
// Cookie values set by the server
var cookieValuesSetByTheServer = function(req, res, next, userSessionObject, callback) {
userSessionObject.STUFF = STUFF;
logs.dev('cookieValuesSetByTheServer');
setTimeout(function(){callback(req.appVariables.error, '1');}, 3000);
};
// Cookie values from Twitter
var cookieValuesFromTwitter = function(req, res, next, userSessionObject, callback) {
userSessionObject.moreSTUFF = moreSTUFF;
logs.dev('cookieValuesFromTwitter')
callback(req.appVariables.error, '2');
};
// Cookie values from User Database
var cookieValuesFromUserDatabase = function(req, res, next, userSessionObject, callback) {
userSessionObject.otherSTUFF = otherSTUFF;
logs.dev('cookieValuesFromUserDatabase');
setTimeout(function(){callback(req.appVariables.temporarilyUnavailableCalled, '3');}, 6000);
};
// Call all functions in Series
async.series([
function(callback){
cookieValuesSetByTheServer(req, res, next, userSessionObject, callback);
},
function(callback){
cookieValuesFromTwitter(req, res, next, userSessionObject, callback);
},
function(callback){
cookieValuesFromUserDatabase(req, res, next, userSessionObject, callback);
}
], function(err, results){
if ( err == null ) {
logs.dev(results);
return true;
}
else {
logs.dev(err);
return false;
}
});
};
答案 0 :(得分:2)
您需要等待async.series
完成才能发送回复。通常的方法是传递一个回调函数:
accountCookies(req, res, next, function theCallbackFunction(success) {
res.redirect(302, 'https://' + req.host + '/account');
});
// in your async module
module.exports = function (req, res, next, theCallbackFunction) {
...
async.series([ ... ], function(err, results) {
if ( err == null ) {
logs.dev(results);
theCallbackFunction(true);
} else {
logs.dev(err);
theCallbackFunction(false);
}
});
};
换句话说:您不能在异步函数中使用return
将返回值传递回调用者。
答案 1 :(得分:0)
您可以尝试使用只执行next
的中间件功能替换res.redirect
回调,然后传递请求。
accountCookies(req, res, function(req, res, next) {
res.redirect(302, 'https://' + req.host + '/account');
next();
});