插入违反唯一索引的 MongoDB 文档时如何捕获错误?

新手上路,请多包涵

我正在构建一个 MEAN 应用程序。

这是我的用户名模式,用户名应该是唯一的。

 var mongoose = require('mongoose');
var Schema = mongoose.Schema;

module.exports = mongoose.model('User', new Schema({
    username: { type: String, unique: true }
}));

在我的发布路线上,我这样保存用户:

 app.post('/authenticate', function(req, res) {
        var user = new User({
            username: req.body.username
        });

        user.save(function(err) {
            if (err) throw err;

            res.json({
                success: true
            });

        });
    })

如果我再次使用相同的用户名发帖,我会收到此错误:

MongoError: insertDocument :: caused by :: 11000 E11000 重复键错误索引:

有人可以解释如何而不是错误发送 json { succes: false, message: 'User already exist!' }

注意:在我发布用户后我会自动进行身份验证,不需要密码或其他东西。

原文由 Hiero 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 556
2 个回答

您将需要测试从保存方法返回的错误,看看它是否因重复的用户名而抛出。

 app.post('/authenticate', function(req, res) {
  var user = new User({
    username: req.body.username
  });

  user.save(function(err) {
    if (err) {
      if (err.name === 'MongoError' && err.code === 11000) {
        // Duplicate username
        return res.status(422).send({ succes: false, message: 'User already exist!' });
      }

      // Some other error
      return res.status(422).send(err);
    }

    res.json({
      success: true
    });

  });
})

原文由 Jason Cust 发布,翻译遵循 CC BY-SA 4.0 许可协议

您还可以试用这个不错的包 mongoose-unique-validator ,它使错误处理变得更加容易,因为当您试图违反唯一约束时,您将收到 Mongoose 验证错误,而不是来自 MongoDB 的 E11000 错误:

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

// Define your schema as normal.
var userSchema = mongoose.Schema({
    username: { type: String, required: true, unique: true }
});

// You can pass through a custom error message as part of the optional options argument:
userSchema.plugin(uniqueValidator, { message: '{PATH} already exists!' });

原文由 chridam 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题