Подтвердить что ты не робот

Разница в мангусте между предварительным сохранением и проверкой? Когда использовать какой?

В настоящее время я использую pre('save') для проверки:

UserSchema.pre('save', true, function(next, done) {
    var self = this //in case inside a callback
    var msg = helper.validation.user.username(self.username)
    if (msg) {
        self.invalidate('username', msg)
        done(helper.getValidationError(msg))
    }
    else
        done()
    next()
})

Вспомогательный модуль имеет функцию, которая принимает ввод и возвращает сообщение об ошибке.

exports.user = {
    username: function(input) {
        if (!input)
            return 'username is required'
        var min = 3
        var max = 10
        if (input.length < min)
            return 'username min of length is ' + min
        if (input.length > max)
            return 'username max of length is ' + max
        return null
    }
}

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

4b9b3361

Ответ 1

Обновление:

Проверка выполняется до того, как пользователь определил крючки. Вы можете следить за этот пост github, где заявляет участник,

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

если нам нужна проверка для повторного запуска после внесения изменений изнутри крюк, мы всегда можем запустить вручную this.validate(next).


Устаревшие:

Да, есть небольшая разница, которую я знаю.

Предварительные крючки выполняются перед проверкой.

В github есть закрытая проблема, требующая проверки перед предварительными перехватами, https://github.com/Automattic/mongoose/issues/400.


А также есть причина не иметь валидацию перед предварительными перехватами, указанную в той же ссылке @kamholz:

Скажем, у вас есть два поля: foo и fooSort, оба они требуются. fooSort - это с пониженной или иначе преобразованной версией foo, которая будет использоваться в сортировка. Поскольку fooSort может быть автоматически сгенерирован, это имеет смысл чтобы сделать это в кэше предварительного сохранения. Но поскольку проверка выполняется сначала, это будет сбой перед запуском предварительного сохранения и возможность заполнить Значение fooSort. Это не вопрос проверки работоспособности снова вручную.

Опять же, если вы хотите что-то подтвердить, а затем нужно проверить для подтверждения:

UserSchema.post('validate', function(next){
    console.log("post validate called");
    next();
});

<ч/" > Итак, для сводки, одна разница, которую я вижу,

  • вы можете использовать оба метода до тех пор, пока вы получите входные данные для сохранения в db напрямую, не изменяя ничего (только проверка).

  • Если вы что-то изменяете, вам нужно использовать pre save hook.

Забастовкa >

Ответ 2

Этот ответ неверен. Если вы переходите к: https://github.com/Automattic/mongoose/issues/400 и читаете ответы на эту тему у вкладчика мангуста, вы увидите, что он отмечает, что они запускаются раньше специально.

Тема называется: валидация должна работать после всех других предварительных скинов

Mongoose contributor aheckmann утверждает, что:

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