处理多个重复错误mongoose nodejs

时间:2018-04-05 10:19:22

标签: node.js mongoose

我有像这样的用户架构

const UserSchema = new Schema({
  username: {
    type: String,
    unique: true,
    required: true,
    lowercase: true,
    trim: true
  },
  email: {
    type: String,
    unique: true,
    required: true
  },

  phoneNumber: {
    type: Number,
    unique: true,
    required: true
  },
});

当我发布重复namephonenumberemail的用户时。我收到这样的错误: 这是错误消息E11000 duplicate key error collection: project.users index: username_1 dup key: { : "john" }

所以我的问题是,我怎么知道它是一个重复的名称或重复的phonenumber。我希望收到这样的错误。

This phone number has been already used
This name has been already used

2 个答案:

答案 0 :(得分:0)

或者,您可以使用path validation mechanism

UserSchema.path('username').validate(function(value, done) {
    this.model('User').count({ username: value }, function(err, count) {
        if (err) {
            return done(err);
        } 
        done(!count);
    });
}, 'User Name already exists');

UserSchema.path('email').validate(function(value, done) {
    this.model('User').count({ email: value }, function(err, count) {
        if (err) {
            return done(err);
        } 
        done(!count);
    });
}, 'Email already exists');
UserSchema.path('phoneNumber').validate(function(value, done) {
    this.model('User').count({ phoneNumber: value }, function(err, count) {
        if (err) {
            return done(err);
        } 
        done(!count);
    });
}, 'Phone already exists');

答案 1 :(得分:0)

您可以在错误处理程序中捕获错误。您可以使用正则表达式获取路径名称和值。简单的例子:

app.use((err, req, res, next) => {
  if (err.code === 11000 || err.code === 11001) {
        const pathRegex = err.message.match(/\.\$([a-z]+)/)
        const path = pathRegex ? pathRegex[1] : '';
        const keyRegex = err.message.match(/key:\s+{\s+:\s\"(.*)(?=\")/)
        const key = keyRegex ? keyRegex[1] : '';
        return res.status(409)
            .json({ status: false, message: `${path} '${key}' already exists`})
    }
}

您还可以查看产生猫鼬“验证错误”的mongoose-unique-validator。你可以更轻松地解析。