выполнить промежуточное программное обеспечение проверки после проверок проверки

#javascript #node.js #express-validator

#javascript #node.js #экспресс-валидатор

Вопрос:

Я хочу создать экспресс-REST API и хочу проверить параметры запроса и тело запроса. Если все в порядке, я хочу вызвать логику контроллера.

Мое промежуточное программное обеспечение для проверки является

 const { validationResult } = require('express-validator/check');

module.exports = (req, res, next) => {
    const validationErrors = req.validationResult();

    if (!validationErrors.isEmpty()) {
        // send a 400
    }

    next();
}
  

и я использую его в своих маршрутах перед вызовом контроллера. Это фрагмент моего topics.js файл маршрута

 const validation = require('../middleware/validation.js');
const { check } = require('express-validator/check');

router.get('/', topicsController.getAllTopics);

router.get('/:topicId', [
    check('topicId').isUUID()
], validation, topicsController.getTopicById);

router.post('/', authenticationCheck, authorizationCheck, [
    check('parentTopicId').isUUID() || check('parentTopicId').isNull(), // check if it's a UUID. If not, check if it's null
    !check('name').isEmpty(), // is it not empty?
], validation, topicsController.createTopic);

router.put('/:topicId', authenticationCheck, authorizationCheck, [
    check('topicId').isUUID(),
    check('parentTopicId').isUUID() || check('parentTopicId').isNull(),
    !check('name').isEmpty(),
], validation, topicsController.updateTopic);

router.delete('/:topicId', authenticationCheck, authorizationCheck, [
    check('topicId').isUUID()
], validation, topicsController.deleteTopic);
  

Я пытался разобраться с этим с помощью документов

https://express-validator.github.io/docs/#basic-guide

но при запуске API я получаю эту ошибку

Ошибка: Route.post() требует функции обратного вызова, но получил [логическое значение объекта]

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

Есть ли способ исправить файл маршрута? Я не хочу обрабатывать логику проверки в моем файле контроллера. Я думаю, что это должно быть сделано раньше.

Ответ №1:

Вам нужно использовать oneOf для проверки условных параметров.

В ваших маршрутах, которые вы используете check('parentTopicId').isUUID() || check('parentTopicId').isNull() , но это возвращает логическое значение, а для express требуется промежуточное программное обеспечение. oneOf был создан специально для этого.

Также вам следует заменить !check на check('name').not().isEmpty() .

Комментарии:

1. спасибо за вашу помощь. Я обновил его до pastebin.com/scNKnHNy но это не исправило проблему

2. вы также используете !check.isEmpty() вы должны использовать check.not().isEmpty()

3. Спасибо. Есть ли способ проверить, является ли что-то null ? Потому что isNull это тоже не функция : (

4. итак, я не хочу проверять, пуста ли переменная, мне действительно нужно проверить, имеет ли она значение null

5. да, если вы используете express validator > = 5.3.0, вы можете использовать .exists и использовать опцию checkNull. express-validator.github.io/docs /…