Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS Bluebird promise在处理程序中创建,但未从中返回_Javascript_Node.js_Express_Promise_Bluebird - Fatal编程技术网

Javascript NodeJS Bluebird promise在处理程序中创建,但未从中返回

Javascript NodeJS Bluebird promise在处理程序中创建,但未从中返回,javascript,node.js,express,promise,bluebird,Javascript,Node.js,Express,Promise,Bluebird,我有以下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.syste

我有以下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();
    });
};
My Session.validate_会话代码:

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\u Session
)与基于回调的代码(
next
)的混合。可以预期,
next()
调用不是异步的(不创建任何承诺),或者返回该承诺,而它不是异步的(责怪express)

有两种方法可以避免警告:

  • 让express执行错误处理,如果出现错误,则调用
    next
    。在这种情况下,您可以使用:

  • 如上所述,您可以显式地
    返回null
    ,而不是返回
    未定义的
    值,
    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();
        });
    };
    

    • 这是基于承诺的代码(
      会话。验证会话
      )与基于回调的代码(
      下一步
      )的混合。可以预期,
      next()
      调用不是异步的(不创建任何承诺),或者返回该承诺,而它不是异步的(责怪express)

      有两种方法可以避免警告:

      • 让express执行错误处理,如果出现错误,则调用
        next
        。在这种情况下,您可以使用:

      • 如上所述,您可以显式地
        返回null
        ,而不是返回
        未定义的
        值,
        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();
            });
        };
        

      第12行是
      返回下一步()?我真的很想知道为什么在
      validate_会话
      第12行是
      return next()?我真想知道为什么您没有收到有关in
      validate\u会话的警告