簡體   English   中英

NodeJS Bluebird promise 在處理程序中創建但未從中返回

[英]NodeJS Bluebird promise created in a handler but was not returned from it

我有以下 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)

如果有人有任何解決方案,那就太好了。 我在我的項目中有許多承諾,它們都非常相似,而且都運行良好,但我無法理解這一點。

這來自基於Session.validate_session的代碼 ( Session.validate_session ) 與基於回調的代碼 ( next ) 的混合。 預計next()調用要么不是異步的(不創建任何承諾),要么返回該承諾,而它沒有(責備表達)。

有兩種方法可以避免警告:

  • 讓 express 進行錯誤處理,如果發生錯誤,則調用next並帶有錯誤。 在這種情況下,您可以使用.asCallback方法

     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); };
  • 正如警告解釋所說,您可以顯式return null而不是返回next()產生的undefined值:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM