gpt4 book ai didi

node.js - Sequelize promise 总是返回假

转载 作者:行者123 更新时间:2023-12-03 22:21:00 24 4
gpt4 key购买 nike

我正在创建一个 react-native 应用程序。
流程是这样的,客户必须输入电子邮件和密码才能注册,数据将保存在数据库中。在保存数据之前,我已经使用 pre-hook beforeValidate 使用 bcrypt 散列密码。
到这里为止,一切正常,但是当 instanceMethod comparePassword 做出 promise 时,我似乎无法返回 true。
我有一个客户模型 Customer.js 文件,如下所示:

const Sequelize = require('sequelize');
const bcrypt = require('bcrypt');
const db = require('../config/database');

const Customer = db.define('customer', {
id : {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
allowNull: false
},
email : {
type: Sequelize.STRING,
unique: true,
allowNull: false
},
password : {
type: Sequelize.STRING,
allowNull: false
},
createdAt : {
type: Sequelize.NOW
},
updatedAt : {
type: Sequelize.NOW
}
}, {
hooks: {
afterValidate: (customer) => {
customer.password = bcrypt.hashSync(customer.password, 10);
}
},
instanceMethods: {
comparePassword: (candidatePassword) => {
return new Promise((resolve, reject) => {
bcrypt.compareSync(candidatePassword, this.password, (err, isMatch) => {
if(err) {
return reject(err);
}
if(!isMatch) {
return reject(false);
}
resolve(true);
});
});
}
}
});

module.exports = Customer;
和 authRoutes.js 文件的片段,如下所示:
router.post('/login', async (req, res) => {
const { email, password } = req.body;

if ( !email || !password ) {
return res.status(422).send({error: 'Must provide email and password!'});
}

const customer = await Customer.findOne({ where: {email} });

if(!customer) {
return res.status(422).send({error: '1. Invalid email or password!'});
}

try {
await customer.comparePassword(password);
const token = jwt.sign({ email }, 'MY_SECRET_KEY');
res.send({ email, token });
} catch(err) {
return res.status(422).send({error: '2. Invalid email or password!'});
}
});

没有错误或任何错误,但即使我输入了正确的凭据,它也总是会捕获“2. 无效的电子邮件或密码”错误。任何形式的帮助表示赞赏。谢谢你。

最佳答案

我创建了一个函数 (comparePassword) 来比较密码和散列密码,它使用 bcrypt 来比较密码。

const bcrypt = require('bcryptjs');

const customer = await Customer.findOne({ where: { email } });
const comparePassword = (hashedPassword, password) => {
return bcrypt.compareSync(password, hashedPassword);
};
try {
if (!comparePassword(customer.password, password) {
return res.status(422).send({ error: '2. Invalid email or password!' });
}
else {
const token = jwt.sign({ email }, 'MY_SECRET_KEY');
return res.status(200).send({ email, token });

}
} catch (err) {
console.log(err)
return res.status(500).send({ error: 'something bad happened on server' });
}

关于node.js - Sequelize promise 总是返回假,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64657939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com