当函数包含异步代码时,hapi-auth-basic验证函数无法正常工作

时间:2019-01-17 12:17:46

标签: javascript node.js basic-authentication hapijs

我正在使用hapi-auth-basic版本5.0.0在我的hapi服务器v17.2.2中进行身份验证。当验证函数中包含异步代码时,它将给出错误。该怎么办?

我使用hapi-cli创建了一个hapi项目。它有一个名为policy的文件夹,其中包含用于身份验证的验证功能。 为方便起见,我对其进行了如下修改

const Boom = require('boom');
const User = Models.User

module.exports = async (request, email, password, h) => {
    if (!email || !password) {
        return {
          isValid: false,
          credentials: null
        }
    }
    User.findOne({
        email,
        role: 'admin'
    }).exec((err, currentUser) => {
        if (!currentUser || err) {
            return Boom.badRequest('You must be admin user');
        }
        request.adminUser = currentUser;
        return {
          isValid: true,
          credentials: currentUser
        }
    });
};

如果给定的电子邮件地址存在并且用户角色为admin,我想对用户进行身份验证 但是我遇到了以下错误

Debug: internal, implementation, error 
    TypeError: Cannot destructure property `isValid` of 'undefined' or 'null'.
    at Object.authenticate (/home/sruthi/IoTRL/hapi-api/node_modules/hapi-auth-basic/lib/index.js:64:56)
    at <anonymous>

当我这样返回{isValid: true, credentials: {email}}

module.exports = async (request, email, password, h) => {
    if (!email || !password) {
        return {
          isValid: false,
          credentials: null
        }
    }
    return {
      isValid: true,
      credentials: {email}
    }
};

没有异步代码从数据库中获取用户,它就可以正常工作。

1 个答案:

答案 0 :(得分:0)

由于您的函数未返回任何内容,因此Mongoose exec((err,user))超出了您函数的范围,并且您已经在使用异步函数,为什么不使用await语法。

在这里,快速重写您的代码。

module.exports = async (request, email, password, h) => {
    if (!email || !password) {
        return {
          isValid: false,
          credentials: null
        }
    }

    try
    {
        const user = await User.findOne({ email, role: 'admin' }).exec();

        // user doesn't exist
        if(!user){
            return Boom.unauthorized('You must be admin user');
        }

        // we found the user, let's authenticate
        request.adminUser = currentUser;
        return {
          isValid: true,
          credentials: currentUser
        }
    } catch(e){
        // handle other errors
        return Boom.badRequest(e);
    }   
};