Node js async.series无法使用Express应用程序 – 响应发生得太快

我有一个Node js Express应用程序,我从许多不同的地方(服务器,Twitter,另一个数据库等)设置cookie。 这些都需要串联。 为了避免callback噩梦,我试图使用Async.js。 但是,在async.series调用完成之前,响应会一直发送。 我怎样才能确保async.series完成,然后调用res.redirect?

使用asynchronous调用模块

// OTHER CODE accountCookies(req, res, next); // THE MODULE WITH ASYNC res.redirect(302, 'https://' + req.host + '/account'); 

asynchronous模块

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

};

您需要等待async.series完成之后才能发送响应。 通常的做法是传递一个callback函数:

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

换句话说:你不能在asynchronous函数中使用返回值来将返回值传递给调用者。

您可以尝试使用只执行res.redirect的中间件函数replacenextcallback,然后传递请求。

 accountCookies(req, res, function(req, res, next) { res.redirect(302, 'https://' + req.host + '/account'); next(); });