Проверяйте исходное входящее значение перед приведением к типу схемы mongoose - PullRequest
1 голос
/ 03 апреля 2019

Как я могу проверить тип входящего значения, прежде чем оно будет приведено к типу, который мы указали в типе свойства в Schematype?

У меня есть такая схема модели (вырежьте другие свойства, такие как имя, пароль и т. Д.)

const User = mongoose.model('User', {
    age : {
        type: Number, // type of data 
        default: 0, // if don't provided, client will has 0 for age value
        validate(value) { // 
            console.log(typeof(value));

            if(value === null){ 
                throw new Error("Age can not be empty string, really ?")
            } else if(value < 0) {
                throw new Error('Age must be a positive number')
            }
        }
    }
})

Затем я пытаюсь создать нового пользователя, но пытаюсь перевести логическое значение в возраст, и оно превращается в значение либо 1 для истинного, либо 0 для ложного.Я провел некоторый тест и получил следующее:

  1. значение в функции проверки - это новое значение после преобразования в тип Number, поэтому, когда дело доходит до функции validate (), он можетбудет 1 или 0

  2. , даже если я поставлю функцию validate () перед типом: Number.Все еще получил значение 1 или 0.

1 Ответ

0 голосов
/ 11 апреля 2019

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

Приведение выполняется при создании экземпляра модели.

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

Поскольку приведение выполняется до проверки достоверности, вы получаете значение, уже приведенное в validatefunction.

Если вы не хотите, чтобы Number SchemaType был приведен, когда значение не является номером типа, существует обходной путь, определяющий пользовательский метод set для свойства.Этот метод set получает исходное значение модели в качестве параметра, и он будет выполнен до приведения, поэтому у вас есть возможность вернуть значение, которое не может быть приведено к числу, например непустую строку.Таким образом, mongoose выдаст ValidationError при попытке сохранить экземпляр модели.

Примерно так:

const User = mongoose.model('User', {
    age : {
        type: Number, // type of data 
        default: 0, // if don't provided, client will has 0 for age value
        set: v => typeof v !== 'number' ? 'Throw error' : v    
    }
});

Для логического типа схемы вы можете использовать свойства convertToTrue и convertToFalse, чтобы определить, какие значения должны быть преобразованы в true или false соответственно.

Пожалуйста, проверьте документация mongoose для получения дополнительной информации.

...