我正在使用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}
}
};
没有异步代码从数据库中获取用户,它就可以正常工作。
答案 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);
}
};