2017-01-05 1 views
1

В моей схеме пользователи у меня есть поле электронной почты, определенное, как показано ниже:Mongoose уникального валидатор не ведет себя, как и другие валидаторы

... 
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'] 
}, 
... 

Когда я покидаю почту пустой при создании пользователя, я могу видеть мое cutomised сообщения об ошибке определенных в схеме required: [true, 'A user must have an email address']. Однако, если я выбираю адрес электронной почты, который уже используется другим пользователем, я получаю другую ошибку, я не вижу свое настроенное сообщение, определенное в поле uniqueunique: [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: { : "[email protected]" } 
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: { : "[email protected]" }', 
driver: true, 
code: 11000, 
index: 0, 
errmsg: 'E11000 duplicate key error collection: stellium-io.users index: email_1 dup key: { : "[email protected]" }', 
getOperation: [Function], 
toJSON: [Function], 
toString: [Function] } 

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

ответ

1

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

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

Вы должны сами обрабатывать эти ошибки, если хотите создать персонализированные сообщения об ошибках. Документация Mongoose (поиск «Обработка ошибок Middleware») предоставляет вам пример о том, как создать обработку пользовательских ошибок:

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

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

1

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

Вы должны сами обрабатывать эти ошибки, если хотите создать собственные сообщения об ошибках.

как:

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