@vkarpov15 предложил код ниже в этом комментарии
schema.post('findOneAndUpdate', (result, next) =>{
if (result.docField == 'invalidValue'){
return next(new mongoose.Error.ValidationError('docField had an invalid value'));
}
// ...
});
Но ValidationError
не содержит пользовательского сообщения
docField имеет недопустимое значение
Вместо этого сообщение представляет собой просто готовое сообщение.
Проверка не удалась
Это ValidationError в строке из:
{
"errors": {},
"_message": "Validation failed",
"message": "Validation failed",
"name": "ValidationError"
}
Я тестировал его в v 4.13.8 и v 5.0.7.
привет @jeremyml. Из того, что я могу сказать, похоже, что @vkarpov15 просто помогал с асинхронной частью хука, который вы предложили. После просмотра источника ValidationError может показаться, что если вы дадите ему строку вместо экземпляра модели, ваше сообщение будет только «Проверка не удалась».
function ValidationError(instance) {
this.errors = {};
this._message = '';
if (instance && instance.constructor.name === 'model') {
this._message = instance.constructor.modelName + ' validation failed';
MongooseError.call(this, this._message);
} else {
this._message = 'Validation failed';
MongooseError.call(this, this._message);
}
this.name = 'ValidationError';
if (Error.captureStackTrace) {
Error.captureStackTrace(this);
} else {
this.stack = new Error().stack;
}
if (instance) {
instance.errors = this.errors;
}
}
Если вы можете жить с экземпляром Error, работает следующее:
#!/usr/bin/env node
'use strict'
const mongoose = require('../lib/test_db')
const Schema = mongoose.Schema
const testSchema = Schema({
docField: String
})
testSchema.post('findOneAndUpdate', (result, next) => {
let err = new Error('invalid docfield value')
err.name = 'ValidationError'
if (result.docField === 'invalidValue') {
return next(err)
}
})
const Test = mongoose.model('test', testSchema)
const test = new Test({
docField: 'valid'
})
let savedDoc = test.save()
savedDoc.then(() => {
Test.findOneAndUpdate({
_id: test.id
}, { docField: 'invalidValue' }, { runValidators: true, new: true }, (err, res) => {
if (err) { return console.error(err) }
console.log(res)
})
})
вывод:
InspiredMacPro:Help lineus$ ./mongoose5/6171/index.js
{ ValidationError: invalid docfield value
at Query.testSchema.post (/Users/lineus/dev/Help/mongoose5/6171/index.js:12:25)
at callMiddlewareFunction (/Users/lineus/dev/Help/mongoose5/node_modules/kareem/index.js:399:23)
at next (/Users/lineus/dev/Help/mongoose5/node_modules/kareem/index.js:193:9)
at Kareem.execPost (/Users/lineus/dev/Help/mongoose5/node_modules/kareem/index.js:217:3)
at _cb (/Users/lineus/dev/Help/mongoose5/node_modules/kareem/index.js:289:15)
at _init (/Users/lineus/dev/Help/mongoose5/node_modules/mongoose/lib/query.js:2010:5)
at model.Document.init (/Users/lineus/dev/Help/mongoose5/node_modules/mongoose/lib/document.js:370:5)
at completeOne (/Users/lineus/dev/Help/mongoose5/node_modules/mongoose/lib/query.js:1996:12)
at cb (/Users/lineus/dev/Help/mongoose5/node_modules/mongoose/lib/query.js:2368:14)
at /Users/lineus/dev/Help/mongoose5/node_modules/mongoose/lib/query.js:2454:16
at /Users/lineus/dev/Help/mongoose5/node_modules/mongoose/lib/utils.js:418:16
at session.endSession (/Users/lineus/dev/Help/mongoose5/node_modules/mongodb/lib/utils.js:400:74)
at ClientSession.endSession (/Users/lineus/dev/Help/mongoose5/node_modules/mongodb-core/lib/sessions.js:69:41)
at args.push (/Users/lineus/dev/Help/mongoose5/node_modules/mongodb/lib/utils.js:397:17)
at handleCallback (/Users/lineus/dev/Help/mongoose5/node_modules/mongodb/lib/utils.js:128:55)
at /Users/lineus/dev/Help/mongoose5/node_modules/mongodb/lib/collection.js:2296:12 name: 'ValidationError' }
^C
InspiredMacPro:Help lineus$
@jeremyml ты прав, мой пример был неверным
schema.post('findOneAndUpdate', (result, next) =>{
if (result.docField == 'invalidValue'){
var validationError = new mongoose.Error.ValidationError(null);
validationError.addError('docField', new mongoose.Error.ValidatorError({ message: 'Invalid' }));
return next(validationError);
}
// ...
});
ValidationError — это сопоставление путей к экземплярам ValidatorError, поэтому вам нужно добавить один из этих
Самый полезный комментарий
@jeremyml ты прав, мой пример был неверным
ValidationError — это сопоставление путей к экземплярам ValidatorError, поэтому вам нужно добавить один из этих