Я хочу создать Express REST API и хочу проверить параметры запроса и тело запроса.
У меня есть файл маршрутизатора, управляющий всеми маршрутами. При вызове localhost:3000/users
маршрутизатор перенаправит на
app.use('/users', require(`./routes/users.js`));
В этом файле маршрутов я бы управлял всеми пользовательскими маршрутами
router.get('/', usersController.getAllUsers);
router.get('/:userId', usersController.getUserById);
router.post('/signup', usersController.signUp);
router.post('/signin', usersController.signIn);
router.post('/signout', authenticationCheck, usersController.signOut);
router.put('/:userId', authenticationCheck, authorizationCheck, usersController.updateUserById);
router.delete('/:userId', authenticationCheck, authorizationCheck, usersController.deleteUserById);
Как видите, некоторые маршруты имеют authenticationCheck
, который обрабатывает управление сеансами с помощью веб-токенов JSON. authorizationCheck
обрабатывает разрешения.
Сам контроллер будет выполнять реальную логику
exports.deleteUserById = async (req, res, next) => {
const { userId } = req.params;
// validate the userID here?
// try to delete the user from the database
// send a response
};
Чтобы убедиться, что параметры и переменные тела имеют правильный формат, я хочу использовать модуль express-validator
. У меня вопрос, когда я должен подтвердить запрос?
Я мог бы сначала проверить
router.delete('/:userId', validation(arguments), authenticationCheck, authorizationCheck, usersController.deleteUserById);
где validation(arguments)
будет принимать некоторые параметры для проверки и отправлять 400
в случае сбоя. Это было бы хорошо, чтобы избежать ненужного выполнения кода, но раньше проверка подлинности или проверки подлинности не выполнялась.
Я также мог бы проверить перед вызовом логики контроллера
router.delete('/:userId', authenticationCheck, authorizationCheck, validation(arguments), usersController.deleteUserById);
сначала проверить аутентификацию и авторизацию, но, возможно, это приведет к ненужному выполнению кода.
Оба подхода имеют проблему, заключающуюся в том, что логика проверки обрабатывается в файле маршрутов. Вы должны будете синхронизировать необходимые переменные контроллера в файле маршрутов и позже в файле контроллера.
Наконец, я мог сначала вызвать контроллер и немедленно запустить проверку.
Какая лучшая практика здесь?