Mongoose: findOneAndUpdate ๋ฏธ๋“ค์›จ์–ด์— ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒŒ์‹œ๋ฌผ์—์„œ ValidationError ๋ฐ˜ํ™˜

์— ๋งŒ๋“  2018๋…„ 02์›” 25์ผ  ยท  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 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @jeremyml์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด @vkarpov15 ๋Š” ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ํ›„ํฌ์˜ ๋น„๋™๊ธฐ ๋ถ€๋ถ„์„ ๋„์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ValidationError์— ๋Œ€ํ•œ ์†Œ์Šค๋ฅผ ์‚ดํŽด๋ณธ ํ›„ ๋ชจ๋ธ์˜ ์ธ์Šคํ„ด์Šค ๋Œ€์‹  ๋ฌธ์ž์—ด์„ ์ œ๊ณตํ•˜๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ 'Validation failed'๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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 ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๊ฒฝ๋กœ ๋งคํ•‘์ด๋ฏ€๋กœ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰