Пользовательские сообщения об ошибках с Mongoose

так по Мангусту docs, вы должны иметь возможность установить пользовательское сообщение об ошибке в схеме следующим образом:

 var breakfastSchema = new Schema({
  eggs: {
    type: Number,
    min: [6, 'Too few eggs'],
    max: 12
  },
  bacon: {
    type: Number,
    required: [true, 'Why no bacon?']
  }
});

поэтому я хотел сделать нечто подобное:

var emailVerificationTokenSchema = mongoose.Schema({
   email: {type: String, required: true, unique: [true, "email must be unique"]},
   token: {type: String, required: true},
   createdAt: {type: Date, required: true, default: Date.now, expires: '4h'}
});

идея заключается в том, что при попытке сохранить один из этих токенов, и уже есть конфликтный, он будет выкачивать сообщение об ошибке, в котором говорится: "электронная почта должна быть уникальной".

однако, когда я делаю что-то вроде этого (где я сохранить маркер с тем же электронной почты):

verificationToken.save( function (err) {
    if (err) {
      return console.log(err);
    }
    else {
      return console.log(err);
    }
});

Я продолжаю получать это:

'E11000 duplicate key error: index ___.emailVerificationToken.$email_1 dup key: { : "_____@wdad.com

какие мысли? Параметр unique не поддерживается для пользовательских сообщений? Является ли это жизнеспособным способом решения проблем?

4 ответов


- Это уникальный параметр не поддерживается для пользовательских сообщений?

уникальность в Мангусте не является параметром проверки (например,required); Он говорит Мангусту создать уникальный индекс в MongoDB для этого поля.

ограничение уникальности полностью обрабатывается на сервере MongoDB. При добавлении документа с дубликатом ключа сервер MongoDB вернет отображаемую ошибку (E11000...).

вы должны обрабатывать эти ошибки себя если вы хотите создать пользовательские сообщения об ошибках. The Мангуст документация (ищите "Промежуточное ПО Обработки Ошибок") предоставляет вам пример создания пользовательской обработки ошибок:

emailVerificationTokenSchema.post('save', function(error, doc, next) {
  if (error.name === 'MongoError' && error.code === 11000) {
    next(new Error('email must be unique'));
  } else {
    next(error);
  }
});

(хотя это не дает вам конкретного поля, для которого не удалось выполнить ограничение уникальности)


это не возможно напрямую, как вы пробовали, но вы можете захотеть взглянуть на Мангуст-уникальный-валидатор что позволяет для пользовательского сообщения об ошибке, если уникальность будет нарушена.

в частности, раздел о пользовательские ошибки должно быть интересно для вас.

чтобы получить желаемый

"электронная почта должна быть уникальной"

Это было бы похоже на это

var uniqueValidator = require('mongoose-unique-validator');
...
emailVerificationTokenSchema.plugin(uniqueValidator, { message: '{PATH} must be unique' });

verificationToken.save( function (err) {
    if (err) {
      return res.status(400).send({
          message: (err.name === 'MongoError' && err.code === 11000) ? 'Email already exists !' : errorHandler.getErrorMessage(err)
      });
    }
    else {
      return console.log('No Error');
    }
  });

обновленная версия для мангуста 5.х.х

MySchema.post('save', function (error, doc, next) {
    if (err.name === 'BulkWriteError' && error.code === 11000) 
        next(new Error('This item already exists, please try again'));
    else next(error);
});