【问题标题】:Node js async.series not working with Express app --- response happening too soonNode js async.series 不适用于 Express 应用程序 --- 响应发生得太快
【发布时间】:2013-12-09 21:29:04
【问题描述】:

我有一个 Node js Express 应用程序,我在其中设置来自许多不同位置(服务器、Twitter、另一个数据库等)的 cookie。这些都需要连续发生。为了避免回调噩梦,我尝试使用 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;
    }
});

};

【问题讨论】:

    标签: javascript node.js asynchronous express


    【解决方案1】:

    您需要等待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 将返回值传回给调用者。

    【讨论】:

      【解决方案2】:

      您可以尝试将next 回调替换为只执行res.redirect 然后传递请求的中间件函数。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-24
        • 1970-01-01
        • 1970-01-01
        • 2019-07-15
        • 1970-01-01
        • 2021-01-19
        • 2019-11-26
        • 1970-01-01
        相关资源
        最近更新 更多