Mongoose: рдкреЛрд╕реНрдЯ рд╕реЗ рд╡рд╛рдкрд╕реА рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐ рдвреВрдБрдвреЗрдВOneAndUpdate рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдлрд╝рд░ре░ 2018  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Automattic/mongoose

@ 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 рддреБрдо рд╕рд╣реА рд╣реЛ, рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдЧрд▓рдд рдерд╛

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 рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рдкрдереЛрдВ рдХрд╛ рдорд╛рдирдЪрд┐рддреНрд░рдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рд╛рдп @ рдЬреЗрд░реЗрдореАрдПрдордПрд▓ред рдореИрдВ рдЬреЛ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @ 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;
  }
}

рдпрджрд┐ рдЖрдк рдирд┐рдореНрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ:

#!/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 рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рдкрдереЛрдВ рдХрд╛ рдорд╛рдирдЪрд┐рддреНрд░рдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

varunjayaraman picture varunjayaraman  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

efkan picture efkan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

p3x-robot picture p3x-robot  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lukasz-zak picture lukasz-zak  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jeneser picture jeneser  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ