我有以下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 :(得分: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
而不是返回undefined
产生的next()
值:
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();
});
};