Я создал REST API и хочу проверить тело и параметры перед вызовом логики контроллера. Для проверки я использую Joi (https://www.npmjs.com/package/joi).
Допустим, у меня есть маршрут с одним параметром url и несколькими переменными тела. Объект params
содержит этот параметр url, но Joi по-прежнему возвращает 400
. Подробное сообщение
Требуется идентификатор пользователя
Я попытался создать минималистичный пример, показывающий мой код. Чтобы воспроизвести ошибку, создайте файл app.js
const express = require('express');
const bodyParser = require('body-parser');
const morgan = require('morgan');
const cors = require('cors');
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cors());
app.use('/users', require('./routes/users.js'));
app.listen(3000);
В связи с тем, что каждая проверка не проходит, для ее проверки требуется только один маршрут. Создайте users.js со следующим содержимым
const express = require('express');
const router = express.Router();
const usersController = require('../controllers/users.js');
const usersControllerPolicy = require('../policies/users.js');
router.get('/:userId', usersControllerPolicy.getUserById, usersController.getUserById);
module.exports = router;
А это users.js файл контроллера
exports.getUserById = async (req, res, next) => {
const { userId } = req.params;
return res.status(200).json("everything is fine");
};
Когда дело доходит до политики, я создал политику users.js , которая добавляет необходимую схему в промежуточное ПО
const joi = require('joi');
const schemaValidation = require('../middleware/schemaValidation.js');
module.exports = {
getUserById: (req, res, next) => {
schemaValidation({
params: {
userId: joi.string().guid().required()
},
body: {}
}, req, res, next);
}
}
и тогда схема проверяется моим schemaValidation.js
const joi = require('joi');
module.exports = (schema, req, res, next) => {
const { error } = joi.validate(req, schema);
if (error)
return res.status(400).json("something went wrong");
next(); // execute the controller logic
}
Как видите, я пропускаю весь объект req
. Я делаю это, потому что иногда мне нужно проверить тело и параметры. Параметр url userId
не найден Джои, поэтому мне возвращается код состояния 400.
Как я могу исправить мою проверку промежуточного программного обеспечения для проверки обоих объектов в пределах объекта req
?