Mongoose: ValidationError von Post zurückgeben. findOneAndUpdate-Middleware enthält keine Nachricht

Erstellt am 25. Feb. 2018  ·  3Kommentare  ·  Quelle: Automattic/mongoose

@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

help

Hilfreichster Kommentar

@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

Alle 3 Kommentare

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen