Mongoose Unique字段错误信息处理

Mongoose Unique field error message handling

我对 Mongoose 中的唯一字段有疑问

当我尝试使用现有电子邮件或用户名创建新用户时它起作用了。

现在它总是发送错误 500。

但是有没有办法有效地处理错误消息?例如说(电子邮件已经存在或用户名已经存在)?

const mongoose = require('mongoose');
const uniqueValidator = require('mongoose-unique-validator');

const userSchema = mongoose.Schema({

    email : {type: String, required: true, unique: true},
    password: {type : String, required: true},
    userid: {type : String},
    username: {type : String, required: true, unique: true},

})

userSchema.plugin(uniqueValidator);
userSchema.index({ '$**': 'text' })

module.exports = mongoose.model('User', userSchema);

和节点控制器:

exports.createUser = (req, res, next) => {
  bcrypt.hash(req.body.password, 10).then(
    (hash) => {
      const user = new User({
        email: req.body.email,
        password: hash,
        userid:req.body.userid,
    username:req.body.username,

      });
      user.save().then(
        () => {
          res.status(201).json({
            message: 'User added successfully!'
          });
        }
      ).catch(
        (error) => {
          res.status(500).json({
            error: error
          });
        }
      );
    }
  );
};

感谢帮助

您可以检查您的代码开头是否使用了电子邮件或用户名,并像这样发送带有自定义消息的 400-BadRequest:

exports.createUser =  async (req, res, next) => {

    let user = await User.findOne({ email: req.body.email });
    if (user) return res.status(400).send("Email already exists");

    user = await User.findOne({ username: req.body.username});
    if (user) return res.status(400).send("Username already exists.");
    ...

请注意,我设置了异步,以便能够使用 await。

此外,我建议您使用 async/await 而不是 then catch 块来摆脱回调地狱。你的代码可以这样写 async/await:

exports.createUser = async (req, res, next) => {
  try {
    const { email, password, userId, username } = req.body;

    let user = await User.findOne({ email });
    if (user) return res.status(400).json({ error: "Email already exists" });

    user = await User.findOne({ username });
    if (user) return res.status(400).send({ error: "Username already exists" });

    user = new User({ email, password, userId, username });
    const salt = await bcrypt.genSalt(10);
    user.password = await bcrypt.hash(user.password, salt);
    await user.save();

    res.status(201).json({ message: "User added successfully!" });
  } catch (error) {
    res.status(500).json({ error });
  }
};

每个人都认为它刚刚完成,就在前面处理错误 你作为响应发送 status 500 in catch,它会是这样的: {driver: true, name: "MongoError", index: 0, code: 11000, keyPattern: {...}, ...} 代码:11000 driver:真 指数:0 关键模式: 电子邮件:1 原型:Object 核心价值: 电子邮件:“gjhk@ex.com” 原型:Object 名称:“MongoError” 原型:Object}

反应中的示例句柄:

register = async (name, lastName, email, password, cb) => {
    try {
        const res = await fetch('http://', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({ name, lastName, email, password })
        })
        const result = await res.json()
        if (result.code === 11000) {
            cb(11000)
        }

        if (res.status === 201) {
            localStorage.setItem('authenticated', true)
            localStorage.setItem('userName', result.user.name)
            localStorage.setItem('userLastName', result.user.lastName)
            localStorage.setItem('token', result.token)
            cb()
        } else {
            cb(400)
        }
    } catch{
        cb('Błąd serwera')
    }
}

很抱歉回复的质量,这是我第一次用英文发表评论。