SimpleSchema: условно обязательное поле не работает

Вот как я выполняю проверку с помощью SimpleSchema с условно обязательным полем (module). Так что это требуется только в том случае, если type имеет значение «начало».

клиент

const   module = 'articles',
        _id = 'bmphCpyHZLhTc74Zp'

console.log(module, _id)
// returns as expected 'articles' and 'bmphCpyHZLhTc74Zp'

example.call(
    {
        type  : 'start',
        module: module,
        _id   : _id
    },
    (error, result) => {
        if (error)  console.log(error)
    }
)

сервер

example = new ValidatedMethod({
    name    : 'example',
    validate: new SimpleSchema({
        _id : { type: SimpleSchema.RegEx.Id },
        type: {
            type         : String,
            allowedValues: ['start', 'stop'] },
        module: {
            type         : String,
            optional     : true,
            allowedValues: ['articles'],
            custom       : function() {
                if (this.field('type').value === 'start') return 'required'
                return null
            }
        }
    }).validator(),

    run({ type, _id, module }) {
        console.log(_id, module)
    }
})

Но я получаю ошибку "validation-error" по причине "Module is required".

Я не понимаю, как видите, module вообще имеет значение!


person user3142695    schedule 06.07.2017    source источник


Ответы (1)


Ошибка проверки возникает из-за того, что вы не проверяете, содержит ли модуль какое-либо значение (мой ответ на ваш предыдущий вопрос содержал ошибку), поэтому каждый раз, когда значение type равно start, метод выдает ошибку об обязательном поле. Он даже не проверяет, имеет ли поле module какое-либо значение. Я публикую ваш фиксированный код.

example = new ValidatedMethod({
  name    : 'example',
  validate: new SimpleSchema({
    _id : { type: SimpleSchema.RegEx.Id },
    type: {
      type: String,
      allowedValues: ['start', 'stop'] 
    },
    module: {
      type: String,
      optional: true,
      allowedValues: ['articles'],
      custom: function() {
        if (this.field('type').value === 'start') {
          if(!this.isSet || this.value === null || this.value === "") {
            return 'required'
          }
        }
      }
    }
  }).validator(),
  run({ type, _id, module }) {
    console.log(_id, module)
  }
})
person mparkitny    schedule 06.07.2017
comment
Разве недостаточно сделать if (!this.isSet || !this.value)? - person user3142695; 06.07.2017
comment
Да, использования if (!this.isSet || !this.value) будет достаточно. В любом случае, я оставлю свой ответ как есть, чтобы люди лучше меня поняли. - person mparkitny; 06.07.2017