node.js - Bcrypt.compare() 仅返回 false,在 Promise 下使用
问题描述
我正在使用 Bcrypt 对密码进行哈希处理并将其存储在数据库中,
当我从数据库中检索散列密码并与键入的用户密码进行比较时,Bcrypt 返回 false。
我在 Promise 下使用它,但 bcrypt 在正确的密码上返回 false
这是代码:
userSchema.statics.findByCredentials = function(email, password) {
const User = this;
return User.findOne({email}).then((user) => {
if(!user) {
return Promise.reject();
}
// console.log(user.password);
return new Promise((resolve, reject) => {
bcrypt.compare(password, user.password, (err,res) => {
if(res) {
resolve(user);
}
else {
reject("Problem here");
}
console.log(res);
});
});
});
};
我正在尝试将承诺链连接到主文件,即 server.js 并将详细信息返回给用户,但它不起作用。
这里是快递的路线代码:
app.post('/users/login', (req, res) => {
const body = _.pick(req.body, ['email', 'password']);
// res.send(body);
User.findByCredentials(body.email, body.password)
.then((user) => {
res.send(user);
}).catch((e) => res.send(e));
});
谢谢
解决方案
您是否尝试过使用promise apibcrypt
?
它可能看起来像这样:
userSchema.statics.findByCredentials = function(email, password) {
const User = this;
return User.findOne({email}).then((user) => {
if(!user) {
return Promise.reject();
}
// console.log(user.password);
return bcrypt.compare(password, user.password)
.then(res => {
if (res) {
return user;
}
throw new Error('Problem here');
});
});
}
如果没有,您可能会遇到错误,因此您可以检查err
参数以查看是否有东西从那里返回。除此之外,只要user.password
是原始密码的散列版本,它就应该可以工作。
推荐阅读
- python - 使用 Cloudflare 背后的 API,使用 HTTP Post 和 Requests 库
- mysql - 使用联接时为每个不同的字段值选择随机行
- c - 为什么我使用 gotoxy(x,y) 时没有打印第一列
- jupyter-notebook - 使用 Jupyter Notebook 在降价文本中替换占位符(变量)的最简单方法?
- database - Sqlite 结构
- java - Hadoop Jar FileSystemNotFoundException
- linux - nano中的Ctrl+Z、Ctrl+X和Ctrl+C有什么区别?
- c++ - 不能将 CRTP 用于内部类
- node.js - Mongoose 嵌套查询 - 查找和更新不同文档中的两个字段
- javascript - 编写一个名为 checkForPlagiarism 的函数,它接受两个参数:学生答案数组和文本片段