2016-09-22 16 views
3

我有下面的代码的NodeJS作为一个明确的中间件功能青鸟的NodeJS承诺在处理程序创建的,但不是从返回它

Middleware.is_authenticated = function(req, res, next) 
{ 
    if(req.system_session == undefined || req.system_session.login_status == false) return res.status(401).send({errors: true, error: 'invalid_session', session: req.system_session}).end(); 

    Session.validate_session(req.system_session, req.ip, req.headers['user-agent']) 

    .then(function(session) 
    { 
     return next(); 
    }) 

    .catch(function(err) 
    { 
     req.system_session.destroy(); 
     return res.status(401).send({errors: true, error: err.message, session: req.system_session}).end(); 
    }); 
}; 

我Session.validate_session代码:

Session.validate_session = function(user, user_ip, user_agent) 
{ 
    return new Promise(function(resolve, reject) 
    { 
     if(user.user_id == null || user.user_name == null || user.user_rank == null || user.user_session == null || user_ip == null || user_agent == null) return reject(new Error('invalid_session')); 

     new api_session({user_session: user.user_session}).fetch({columns: ['user_id', 'user_name', 'user_rank', 'user_session', 'user_ip', 'user_agent']}) 

     .then(function(result) 
     { 
      if(result == null) return reject(new Error('invalid_session')); 

      return result.toJSON(); 
     }) 

     .then(function(session) 
     { 
      if(session == null || session.user_id != user.user_id || session.user_name != user.user_name || session.user_rank != user.user_rank || session.user_ip != user_ip || session.user_agent != user_agent) return reject(new Error('invalid_session')); 

      return resolve(session); 
     }) 

     .catch(function(err) 
     { 
      return reject(err); 
     }); 
    }); 
}; 

一切工作正如它应该的那样,一切都完美地执行数据库,以及解决“下一个”路线,甚至显示响应。但无论我怎么努力我不断收到“一个承诺是在处理程序创建的,但不是从它返回”

Warning: a promise was created in a handler at middleware.js:12:11 but was not returned from it 

at new Promise (/Users/Bill/Documents/app/node_modules/bluebird/js/release/promise.js:77:14) 
at Object.Permission.permission_list (/Users/Bill/Documents/app/app/security/permission.js:8:10) 
at PermissionService.permission_list (/Users/Bill/Documents/app/app/http/services/permission_service.js:6:14) 
at Layer.handle [as handle_request] (/Users/Bill/Documents/app/node_modules/express/lib/router/layer.js:95:5) 
at next (/Users/Bill/Documents/app/node_modules/express/lib/router/route.js:131:13) 
at /Users/Bill/Documents/app/app/http/middleware.js:12:11 
at processImmediate [as _immediateCallback] (timers.js:383:17) 

From previous event: 
at Middleware.is_authenticated (/Users/Bill/Documents/app/app/http/middleware.js:10:4) 
at Layer.handle [as handle_request] (/Users/Bill/Documents/app/node_modules/express/lib/router/layer.js:95:5) 
at next (/Users/Bill/Documents/app/node_modules/express/lib/router/route.js:131:13) 
at Route.dispatch (/Users/Bill/Documents/app/node_modules/express/lib/router/route.js:112:3) 
at Layer.handle [as handle_request] (/Users/Bill/Documents/app/node_modules/express/lib/router/layer.js:95:5) 
at /Users/Bill/Documents/app/node_modules/express/lib/router/index.js:277:22 
at Function.process_params (/Users/Bill/Documents/app/node_modules/express/lib/router/index.js:330:12) 
at next (/Users/Bill/Documents/app/node_modules/express/lib/router/index.js:271:10) 
at clientSession (/Users/Bill/Documents/app/node_modules/client-sessions/lib/client-sessions.js:630:5) 
at Layer.handle [as handle_request] (/Users/Bill/Documents/app/node_modules/express/lib/router/layer.js:95:5) 
at trim_prefix (/Users/Bill/Documents/app/node_modules/express/lib/router/index.js:312:13) 
at /Users/Bill/Documents/app/node_modules/express/lib/router/index.js:280:7 
at Function.process_params (/Users/Bill/Documents/app/node_modules/express/lib/router/index.js:330:12) 
at next (/Users/Bill/Documents/app/node_modules/express/lib/router/index.js:271:10) 
at SendStream.error (/Users/Bill/Documents/app/node_modules/express/node_modules/serve-static/index.js:121:7) 
at emitOne (events.js:77:13) 
at SendStream.emit (events.js:169:7) 
at SendStream.error (/Users/Bill/Documents/app/node_modules/express/node_modules/send/index.js:275:17) 
at SendStream.onStatError (/Users/Bill/Documents/app/node_modules/express/node_modules/send/index.js:392:12) 

如果任何人有任何解决方案,将是巨大的。我在我的项目中有许多承诺都非常相似,而且这些承诺都很好,但我无法理解这一点。

+0

线12'返回next();'? – Bergi

+0

我真的不知道为什么你不会在'validate_session'中得到['Promise' constructor antipattern](http://stackoverflow.com/q/23803743/1048572) – Bergi

回答

2

这来自基于承诺的代码(Session.validate_session)与基于回调的代码(next)的混合。预计next()调用要么不是异步的(不会产生任何承诺),要么返回,承诺它不承认(责怪表达)。

有两种方法来避免警告:

  • 让快递做错误处理,如果一个发生调用next一个错误。在这种情况下,你可以使用.asCallback method

    Middleware.is_authenticated = function(req, res, next) { 
        if (req.system_session == undefined || req.system_session.login_status == false) 
         var promise = Promise.reject(new Error('invalid_session')); 
        else 
         var promise = Session.validate_session(req.system_session, req.ip, req.headers['user-agent']); 
    
        promise.asCallback(next); 
    }; 
    
  • 随着warning explanation说,你可以明确地return null,而不是返回undefinednext()产量:

    Middleware.is_authenticated = function(req, res, next) { 
        if (req.system_session == undefined || req.system_session.login_status == false) 
         var promise = Promise.reject(new Error('invalid_session')); 
        else 
         var promise = Session.validate_session(req.system_session, req.ip, req.headers['user-agent']) 
         .catch(function(err) { 
          req.system_session.destroy(); 
          throw err; 
         }); 
    
        promise.then(function(session) { 
         next(); 
         return null; 
        }, function(err) { 
         res.status(401).send({errors: true, error: err.message, session: req.system_session}).end(); 
        }); 
    }; 
    
相关问题