почему mon goose валидатор не проверяет тип поля? - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь проверить схему mon goose, но я не смог понять одну вещь, которая является проверкой типа. Я передаю числовой тип строковому полю и ожидаю, что он потерпит неудачу при проверке, но он пройдет. как это происходит, кто-нибудь может объяснить, пожалуйста, логику c за этим?

образец. js

const mongoose = require('mongoose');

async function validateSample(sample) {
  try {
    await sample.validate();
    return true;
  } catch (error) {
    return false;
  }
}

async function execMethod(){
  var userSchema = new mongoose.Schema({
    phone: {
      type: String,
      minlength: 2,
      maxlength: 4,
      validate: {
        validator: function(v) {
          return /^\d+$/.test(v);
        },
        message: `not a valid phone number!`
      },
      required: [true, 'User phone number required']
    }
  });

  var User = mongoose.model('user', userSchema);
  var validUser = new User({phone: '1234'});
  var invalidUser = new User({phone: 1235});
  const result = await validateSample(validUser);
  const result1 = await validateSample(invalidUser);
  console.log(result);  // true
  console.log(result1)  // expected false as number type is assigned to phone. But returns true, why?
}

execMethod()


1 Ответ

1 голос
/ 18 апреля 2020

Это на самом деле функция проверки Mon goose.

Перед запуском валидаторов Mon goose пытается привести значения к правильному типу. Этот процесс называется приведением документа. Если произойдет сбой приведения по указанному пути, объект error.errors будет содержать объект CastError.

Приведение выполняется до проверки, а при сбое приведения не выполняется.

В этом случае число 1235 преобразуется в строку '1235', которая прошла проверку очень хорошо.

Теперь есть FR, открытый для предоставления Mon goose с возможность переопределить логи приведения c (либо полностью отключить, либо настроить), но она открыта, не реализована.

Другой способ - изменение приведения типов для всего типа ( допускается с 5.4 ), как это:

mongoose.Schema.Types.String.cast(false); // prevents all casts to string

... но это может быть громоздким, так как одно и то же правило применяется ко всем объектам.

...