使用Mongoose的自定义错误消息

Van*_*500 15 error-handling mongoose mongodb node.js

因此根据mongoose 文档,您应该能够在架构中设置自定义错误消息,如下所示:

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

所以我想做类似的事情:

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'}
});
Run Code Online (Sandbox Code Playgroud)

我们的想法是,当您尝试保存其中一个令牌,并且已经存在冲突时,它会输出一条错误消息,指出"电子邮件必须是唯一的".

但是当我做这样的事情时(我使用相同的电子邮件保存令牌):

verificationToken.save( function (err) {
    if (err) {
      return console.log(err);
    }
    else {
      return console.log(err);
    }
});
Run Code Online (Sandbox Code Playgroud)

我一直这样:

'E11000 duplicate key error: index ___.emailVerificationToken.$email_1 dup key: { : "_____@wdad.com
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?自定义消息不支持唯一参数吗?这是一种可行的方式吗?

rob*_*lep 20

自定义消息不支持唯一参数吗?

Mongoose中的唯一性不是验证参数(如required); 它告诉Mongoose在MongoDB中为该字段创建一个唯一索引.

唯一性约束完全在MongoDB服务器中处理.当您添加具有重复键的文档时,MongoDB服务器将返回您正在显示的错误(E11000...).

如果要创建自定义错误消息,则必须自己处理这些错误.将猫鼬文档(搜索"错误处理中间件")提供了有关如何创建自定义错误处理的例子:

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

(虽然这不会为您提供唯一性约束失败的特定字段)


DAX*_*lic 5

尝试时并不能直接实现,但是您可能想看看mongoose-unique-validator,如果违反了唯一性,它将允许自定义错误消息。

特别是您应该对有关自定义错误的部分感兴趣。

为了得到你想要的

“电子邮件必须唯一”

它看起来像这样

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


Gau*_*tam 5

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');
    }
  });
Run Code Online (Sandbox Code Playgroud)