функция проверки hapi-auth-basic не работает должным образом, когда функция содержит асинхронный код - PullRequest
0 голосов
/ 17 января 2019

Я использую hapi-auth-basic version 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 голосов
/ 18 января 2019

Поскольку ваша функция ничего не возвращает, 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);
    }   
};
...