Я создал промежуточное ПО, которое проверяет ввод запроса перед вызовом логики контроллера.
Допустим, у меня есть «получить пользователя по 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) и тело (имя, возраст, ...)