проверить весь объект запроса с помощью joi - PullRequest
1 голос
/ 20 марта 2019

Я создал промежуточное ПО, которое проверяет ввод запроса перед вызовом логики контроллера.

Допустим, у меня есть «получить пользователя по id» - маршрут

const usersController = require('../controllers/users.js');
const usersControllerPolicy = require('../policies/users.js');

router.get('/:userId', usersControllerPolicy.getUserById, usersController.getUserById);

// other routes

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

const joi = require('joi');
const schemaValidation = require('../middleware/schemaValidation.js');

module.exports = {
    getUserById: (req, res, next) => {
        schemaValidation({
            userId: joi.string().guid().required()
        }, req, res, next);
    }

    // other routes
}

userId - это параметр маршрута, а не переменная в теле. schemaValidation промежуточное ПО проверяет данную схему и вызывает next() или отправляет 400 ответ.

const joi = require('joi');
const requestResponder = require('../helpers/requestResponder.js');

module.exports = (schema, req, res, next) => {
    const { error } = joi.validate(req, schema);

    if (error)
        return requestResponder.sendBadRequestError(res);

    next();
}

Когда я вызываю этот маршрут с /users/137eaa6f-75c2-46f0-ba7c-c196fbfa367f, я получаю эту ошибку

сообщение: '"ИД пользователя" необходим "

но проверка должна быть в порядке. Я проверил валидацию joi.validate(req, schema), зарегистрировав req.params, и userId доступен. Чего мне не хватает?


Редактировать:

Я знаю, что могу проверить req.params, но что, если я хочу обновить пользователя? Я должен был бы проверить параметры (userId) и тело (имя, возраст, ...)

1 Ответ

1 голос
/ 20 марта 2019

Ваша схема проверки joi должна отражать req структуру объекта, которая должна работать:

const joi = require('joi');
const schemaValidation = require('../middleware/schemaValidation.js');

module.exports = {
    getUserById: (req, res, next) => {
        schemaValidation(joi.object({
            params: joi.object({
                userId: joi.string().guid().required()
            }).unknown(true)
        }).unknown(true), req, res, next);
    }

    // other routes
}

Когда вам нужно проверить и тело, и параметры:

const joi = require('joi');
const schemaValidation = require('../middleware/schemaValidation.js');

const paramsValidation = joi.object({
    userId: joi.string().guid().required()
}).unknown(true);

const bodyValidation = joi.object({
    name: joi.string().required()
}).unknown(true);

module.exports = {
    getUserById: (req, res, next) => {
        schemaValidation(joi.object({
            params: paramsValidation,
            body: bodyValidation
        }).unknown(true), req, res, next);
    }

    // other routes
}

Но я бы предпочел проверить их отдельно с помощью трех схем joi (body, params, query), например. как это сделано здесь https://www.npmjs.com/package/express-joi-validation#validation-ordering

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...