Node js async.series无法使用Express应用程序--响应发生得太早
Node js async.series not working with Express app --- response happening too soon
我有一个Node js Express应用程序,我在那里设置来自许多不同地方的cookie(服务器、Twitter、另一个数据库等)。这些都需要串联发生。为了避免回调噩梦,我尝试使用Async.js。但是,在Async.series调用完成之前,响应一直在发送。如何确保async.series完成,然后调用res.redirect?
使用异步调用模块
// OTHER CODE
accountCookies(req, res, next); // THE MODULE WITH ASYNC
res.redirect(302, 'https://' + req.host + '/account');
异步模块
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
完成后才能发送响应。通常的方法是传递一个回调函数:
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
将返回值传递回调用者。
您可以尝试用中间件函数替换next
回调,该函数只执行res.redirect
,然后传递请求。
accountCookies(req, res, function(req, res, next) {
res.redirect(302, 'https://' + req.host + '/account');
next();
});
相关文章:
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 节点,express应用程序返回text/javascript响应头(Content-Type),尽管设置了applic
- 如何在phonegap应用程序中处理Ajax json响应
- Chrome在刷新应用程序后30秒以上没有响应(打开了开发工具)
- 为什么我的rails应用程序在生产环境中没有正确响应.js格式
- Node js async.series无法使用Express应用程序--响应发生得太早
- iframe响应为302时重新加载应用程序
- 如何记录Apache Cordova应用程序中加载的iframe的http响应
- Ajax 不会返回对应用程序中的视图页面的响应
- 在 Phonegap 应用程序中,如何指示正在发生对服务器的请求/响应
- 在 ajax 响应中调用应用程序配置方法 - AngularJS
- Node.js使用 Socket.io 的应用程序在OpenShift主机上给出“意外响应代码:400”
- 快速应用程序对 HTML 页面的 POST 响应
- 在 MEAN Web 应用程序中,从 Express(服务器端)发送 HTTP 响应错误 403、500,未在 Angu
- 在 Web 应用程序加载时加载 JSON 响应(JQuery,Django)
- 在猫鼬查询返回集合之前,应用程序应该如何处理 http get 响应
- 如何删除 X-Frame-Options 响应标头,允许应用程序被 iframe
- 在 Angular 项目中迭代 JSON 响应以创建新的 $scope obj 我可以在应用程序中使用的
- 响应式HTML5应用程序
- 在web应用程序中程序化地等待web服务响应