因此,根据 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'}
});

这样的想法是,当您尝试保存其中一个 token 时,已经存在一个冲突的 token ,它将发出一条错误消息,指出“电子邮件必须是唯一的”。

但是,当我做这样的事情时(我用相同的电子邮件保存 token ):
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

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

最佳答案



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

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

如果要创建自定义错误消息,则必须自己处理这些错误。 Mongoose documentation(“错误处理中间件”)为您提供了有关如何创建自定义错误处理的示例:

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

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

关于node.js - Mongoose 的自定义错误消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38945608/

10-11 22:35
查看更多