【问题标题】:Mongoose Unique field error message handlingMongoose Unique 字段错误信息处理
【发布时间】:2020-03-03 20:52:07
【问题描述】:

Mongoose 中的 Unique 字段有问题

当我尝试使用现有电子邮件或用户名创建新用户时,它可以工作。

现在它总是发送错误 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
          });
        }
      );
    }
  );
};

感谢您的帮助

【问题讨论】:

    标签: mongoose mean-stack


    【解决方案1】:

    每个人都认为它刚刚完成,只是在前面处理你发送的错误女巫作为响应女巫状态 500 在 catch 中,它会是这样的: {驱动程序:true,名称:“MongoError”,索引:0,代码:11000,keyPattern:{...},...} 代码:11000 司机:真 指数:0 关键模式: 电子邮件:1 原型:对象 核心价值: 电子邮件:“gjhk@ex.com” 原型:对象 名称:“MongoError” 原型:对象}

    react 中的示例句柄:

    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')
        }
    }
    

    对于回复的质量非常抱歉,这是我第一次用英语发表评论。

    【讨论】:

      【解决方案2】:

      您可以检查您的代码开头是否使用了电子邮件或用户名,并使用您的自定义消息发送 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.");
          ...
      
      

      请注意,我设置了 async,以便能够使用 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 });
        }
      };
      

      【讨论】:

        猜你喜欢
        • 2015-01-20
        • 2019-11-03
        • 1970-01-01
        • 2012-08-05
        • 2014-01-07
        • 2012-12-28
        • 2015-03-08
        • 2018-08-06
        • 1970-01-01
        相关资源
        最近更新 更多