尝试将密码与bcrypt
进行比较时出现此错误
错误: Error: data and hash arguments required
这是我的代码
//compare password
bcrypt.compare(req.param('password'), user.encryptedPassword, function(err, valid) {
if (err) return next(err);
//if password doesn't match
if (!valid) {
var usernamePasswordMismatchError = [{name: 'usernamePasswordMismatch', message: 'Invalid Password'}]
req.session.flash = {
err: usernamePasswordMismatchError
}
res.redirect('/session/new');
return;
}
//log user in
req.session.authenticated = true;
req.session.User = user;
//redirect user to profile page
res.redirect('/user/show/'+ user.id);
});
这是我的架构设置
module.exports = {
attributes: {
name: {
type: 'string',
required: true
},
email: {
type: 'string',
email: true,
required: true,
unique: true
},
phone: {
type: 'string',
required: true
},
encryptedPassword: {
type: 'string'
},
toJSON: function() {
var obj = this.toObject();
delete obj.password;
delete obj.encryptedPassword;
delete obj._csrf;
return obj;
}
},
connection:'mongodb'
};
请问出错了什么?
答案 0 :(得分:0)
当您调用bcrypt.compare()函数时,您需要确保同时提供密码和散列密码。所以在那里打印,看看你错过了什么。
案例1:由于某种原因,req.param('密码')为空(html表单中的字段名称可能有拼写错误)
案例2:user.encryptedPassword为空。对于这种情况,原因可能是您在创建/更新用户记录时没有加密密码。为了确保您这样做,请打开您的数据库,并在创建新用户后检查数据库中的记录,看看您的encryptedPassword是否存在。以下是如何在创建/更新时加密密码的示例:
在您的用户模型中,您可能具有以下功能:
beforeUpdate: function (values, next) {
if (values.password) {
bcrypt.hash(values.password, 10, function (err, hash) {
if (err) {
return next(err);
}
values.encryptedPassword = hash;
next();
});
}
},
beforeCreate: function (values, next) {
bcrypt.hash(values.password, 10, function (err, hash) {
if (err) {
return next(err);
}
values.encryptedPassword = hash;
next();
});
}
请注意以下这一行:
values.encryptedPassword = hash;
由于您在架构中没有密码属性,因此提供的values.password不会保存在任何位置。在您的情况下,另一件事可能是您没有在任何地方设置encryptedPassword。因此,另一种方法是更改架构并将encryptedPassword重命名为简单密码,然后替换
values.encryptedPassword = hash;
与
values.password = hash;
答案 1 :(得分:-1)
不确定比较函数的范围,但它看起来像bcrypt.compare的输入参数中的一个或两个都是空的或null。 (比较函数需要两个输入参数非空和非空)
尝试记录您的req.param('password')和user.encryptedPassword以进一步调试您的问题。