如何解决在没有数据库的情况下使用 bcrypt 散列密码
我创建了一个端点来注册新用户,Rep1
Rep2
Rep3
。
因为我没有使用数据库,所以我通过将新用户推送到数组中来更新数组,然后使用 /register
将此新数组写入 json
文件。
fs.writeJSONFile()
router.post("/register",m.checkFieldsPost,async (req,res) => {
const { email,password } = req.body;
const id = { id: helper.getNewId(users) };
try {
const user = await helper.findUser(users,email);
console.log(`user is ${user}`);
if (user)
return res.status(400).json({
message: "That user already exists!",});
// Generate salt
const salt = await bcrypt.genSalt(10);
// Hash password
const hashedPassword = await bcrypt.hash(password,salt);
const newUser = {
...id,password: hashedPassword,email,};
await users.push(newUser);
await helper.writeJSONFile(filename,users);
return res.status(201).json({
message: `New user was created`,user: newUser,originalPassword: password,hashedPassword,});
} catch (err) {
res.status(500).json({ message: err.message });
// res.status(500).json({ message: "Mesasge from the catch block" });
}
});
我正在尝试注册一个新用户,我首先使用上述函数检查 function findUser(array,email) {
return new Promise((resolve,reject) => {
const row = array.find((r) => r.email == email);
if (!row) {
reject({
message: "User not found",});
reject(null);
}
resolve(row);
});
};
文件中是否已存在该电子邮件:
json
然而,似乎如果没有找到用户,函数调用就会结束,我会向客户端发回一个状态代码。我拒绝承诺的方式有问题吗?我怎么能从承诺拒绝中返回 const user = await helper.findUser(users,email);
?
解决方法
拒绝承诺将其标记为拒绝/失败。 await
关键字将抛出您传递给 reject(...)
的任何内容。因此,当找不到用户时,您的代码会因异常而中止。您应该在 await helper.findUser(...)
调用周围添加 try/catch。或者,如果您希望 await 返回 null 而不是抛出,请调用 resolve(null)
。
这也意味着您不应该两次调用 reject
,或者更糟的是,为与您的代码当前所做的相同的承诺同时调用 reject
和 resolve
。调用其中一个函数并不等同于返回,该函数仍然必须干净地返回。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。