@vkarpov15 schlug den folgenden Code in diesem Kommentar vor
schema.post('findOneAndUpdate', (result, next) =>{
if (result.docField == 'invalidValue'){
return next(new mongoose.Error.ValidationError('docField had an invalid value'));
}
// ...
});
Aber ValidationError
enthält nicht die benutzerdefinierte Nachricht
docField hatte einen ungültigen Wert
Stattdessen ist die Nachricht einfach die vorgefertigte Nachricht
Überprüfung fehlgeschlagen
Dies ist der ValidationError in Zeichenfolge von:
{
"errors": {},
"_message": "Validation failed",
"message": "Validation failed",
"name": "ValidationError"
}
Ich habe es in v 4.13.8 und v 5.0.7 getestet
Hallo @jeremyml. Soweit ich das beurteilen kann, sieht es so aus, als hätte @vkarpov15 nur mit dem asynchronen Teil des von Ihnen vorgeschlagenen Hooks geholfen. Nachdem Sie sich die Quelle für ValidationError angesehen haben, scheint es, dass Ihre Nachricht immer nur „Validation failed“ lautet, wenn Sie eine Zeichenfolge anstelle einer Instanz eines Modells angeben.
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;
}
}
Wenn Sie mit einer Instanz von Error leben können, funktioniert Folgendes:
#!/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)
})
})
Ausgang:
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 du hast recht, mein Beispiel war falsch
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);
}
// ...
});
Ein ValidationError ist eine Zuordnung von Pfaden zu ValidatorError-Instanzen, also müssen Sie eine davon hinzufügen
Hilfreichster Kommentar
@jeremyml du hast recht, mein Beispiel war falsch
Ein ValidationError ist eine Zuordnung von Pfaden zu ValidatorError-Instanzen, also müssen Sie eine davon hinzufügen