用Mongoose自定义错误信息

所以根据mongoose文档 ,你应该能够在模式中设置一个自定义错误消息,如下所示:

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 

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

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

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

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

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

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

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

这是不可能的,因为你试过它,但你可能想看看mongoose独特的validation ,它允许自定义错误消息,如果唯一性将被违反。

特别是关于自定义错误的部分应该是你感兴趣的。

为了得到你想要的

“电子邮件必须是唯一的”

它会看起来类似于这个

 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'); } });