问题描述
我创建了一个端点来注册新用户,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
。调用其中一个函数并不等同于返回,该函数仍然必须干净地返回。