mongoose独特的validation器行为不像其他validation器

在我的用户架构中,我有一个电子邮件字段定义如下:

... email: { unique: [true, 'A user with that email address exists. The email must be unique.'], type: String, lowercase: true, required: [true, 'A user must have an email address'] }, ... 

当我在创build用户时将电子邮件留空时,我可以看到我在模式中定义的cutomised错误消息required: [true, 'A user must have an email address'] 。 但是,如果我select了另一个用户已经使用的电子邮件地址,我得到了一个不同的错误,我看不到在unique字段中定义的自定义邮件unique: [true, 'A user with that email address exists. The email must be unique.'] unique: [true, 'A user with that email address exists. The email must be unique.']

错误,当电子邮件为空(我觉得很有帮助,因为得到错误信息很容易): required注意,我的错误消息用户必须有一个电子邮件地址显示。

 Error create { MongooseError: User validation failed at ValidationError (/Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongoose/lib/error/validation.js:23:11) at model.Document.invalidate (/Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongoose/lib/document.js:1486:32) at /Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongoose/lib/document.js:1362:17 at validate (/Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongoose/lib/schematype.js:705:7) at /Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongoose/lib/schematype.js:742:9 at Array.forEach (native) at SchemaString.SchemaType.doValidate (/Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongoose/lib/schematype.js:710:19) at /Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongoose/lib/document.js:1360:9 at _combinedTickCallback (internal/process/next_tick.js:67:7) at process._tickCallback (internal/process/next_tick.js:98:9) errors: { email: { MongooseError: A user must have an email address at ValidatorError (/Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongoose/lib/error/validator.js:24:11) at validate (/Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongoose/lib/schematype.js:704:13) at /Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongoose/lib/schematype.js:742:9 at Array.forEach (native) at SchemaString.SchemaType.doValidate (/Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongoose/lib/schematype.js:710:19) at /Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongoose/lib/document.js:1360:9 at _combinedTickCallback (internal/process/next_tick.js:67:7) at process._tickCallback (internal/process/next_tick.js:98:9) message: 'A user must have an email address', name: 'ValidatorError', properties: [Object], kind: 'required', path: 'email', value: '' } }, message: 'User validation failed', name: 'ValidationError' } 

电子邮件已被使用时出错: unique

 Error create { MongoError: E11000 duplicate key error collection: stellium-io.users index: email_1 dup key: { : "john@doe.com" } at Function.MongoError.create (/Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongodb-core/lib/error.js:31:11) at toError (/Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongodb/lib/utils.js:114:22) at /Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongodb/lib/collection.js:657:23 at handleCallback (/Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongodb/lib/utils.js:95:56) at /Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongodb/lib/bulk/unordered.js:465:9 at handleCallback (/Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongodb/lib/utils.js:95:56) at resultHandler (/Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongodb/lib/bulk/unordered.js:413:5) at /Users/fleavamini/Projects/stellium/stellium.io/node_modules/mongodb-core/lib/connection/pool.js:455:18 at _combinedTickCallback (internal/process/next_tick.js:67:7) at process._tickCallback (internal/process/next_tick.js:98:9) name: 'MongoError', message: 'E11000 duplicate key error collection: stellium-io.users index: email_1 dup key: { : "john@doe.com" }', driver: true, code: 11000, index: 0, errmsg: 'E11000 duplicate key error collection: stellium-io.users index: email_1 dup key: { : "john@doe.com" }', getOperation: [Function], toJSON: [Function], toString: [Function] } 

这是预期的行为? 我希望能够在unique字段中获取我的自定义错误,并将其返回给尝试创build新用户对象的用户。

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

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

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

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

或者你可以使用这个插件mongoose-unique-validator

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

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

如果要创build自定义错误消息,则必须自己处理这些错误。

喜欢:

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