【问题标题】:Hashing passwords using bcrypt without a database在没有数据库的情况下使用 bcrypt 散列密码
【发布时间】:2021-07-07 02:47:15
【问题描述】:

我创建了一个端点来注册新用户,/register。

由于我没有使用数据库,因此我通过将新用户推入数组来更新数组,然后使用fs.writeJSONFile() 将这个新数组写入json 文件。

以下是注册新用户的代码:

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);

但是,似乎如果找不到用户,函数调用就会结束,我将向客户端发送回状态代码。我拒绝承诺的方式有问题吗?我如何从承诺拒绝中返回 null?

【问题讨论】:

  • 您希望注册多少用户?如果丢失整个用户列表文件会有多糟糕?这可能会以意想不到的方式迅速瓦解。
  • 是的,这更适合学校练习,而不是完整的应用程序。我没有将此应用程序用于实际目的。

标签: api express crud bcrypt


【解决方案1】:

拒绝承诺会将其标记为拒绝/失败。然后await 关键字将抛出您传递给reject(...) 的任何内容。因此,当找不到用户时,您的代码会异常中止。你应该在你的await helper.findUser(...) 电话周围加上一个try/catch。或者,如果您希望 await 返回 null 而不是抛出,请调用 resolve(null)。

这也意味着你不应该调用reject 两次,或者更糟的是,调用reject 和resolve 以获得与你的代码当前所做的相同的承诺。调用其中一个函数不等于返回,函数仍然必须干净地返回。

【讨论】:

  • 不会在await helper.findUser(...) 周围放置try/catch 块会产生相同的结果吗?如果未找到用户,则将执行 catch 块,并且不会调用其余代码。
  • 没错,但是 catch 块可以将 user 设置为 null。我已经编辑了我的答案,包括一种不使用 try/catch 的方法 - 只是不要使用 reject。
猜你喜欢
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 2019-07-17
  • 2016-03-23
  • 1970-01-01
  • 2013-04-02
  • 2018-11-29
相关资源
最近更新 更多