使用猫鼬验证电子邮件唯一性的正确方法是什么?

Lee*_*gan 1 javascript mongoose mongodb node.js

我找不到一种正确的方法来验证 mongoose 中电子邮件的唯一性。我发现没有任何实际工作。我正在考虑使用 Schema.pre,但如果是这种情况,我将如何为此编写代码?Mongoose 文档很差,没有描述 pre 是如何或做什么的。

如果有人能告诉我这通常是如何完成的或为我指明正确的方向,我将不胜感激。我不明白为什么这么简单的事情在猫鼬中没有简单的解决方案......

Fra*_*ion 9

您可以使用自定义验证器

var userSchema = new Schema({
  email: {
    type: String,
    validate: {
      validator: async function(email) {
        const user = await this.constructor.findOne({ email });
        if(user) {
          if(this.id === user.id) {
            return true;
          }
          return false;
        }
        return true;
      },
      message: props => 'The specified email address is already in use.'
    },
    required: [true, 'User email required']
  }
  // ...
});
Run Code Online (Sandbox Code Playgroud)

  • [`this` 指的是文档](https://mongoosejs.com/docs/middleware.html#types-of-middleware) 是的,`this.constructor` 将是实际模型 (2认同)

Sul*_*Sah 5

我更喜欢在注册路径中检查电子邮件的唯一性。

这样我们就可以完全控制应该向客户端发送哪些状态代码或错误消息。

router.post("/register", async (req, res) => {
  try {
    const { email, password } = req.body;

    let user = await User.findOne({ email });
    if (user) return res.status(400).send("User already registered.");

    user = new User({ email, password });
    user.password = await bcrypt.hash(user.password, 10);
    await user.save();

    res.send("registered");
  } catch (err) {
    console.log(err);
    res.status(500).send("Something went wrong");
  }
});
Run Code Online (Sandbox Code Playgroud)