проверить сначала или перед логикой контроллера - PullRequest
2 голосов
/ 16 марта 2019

Я хочу создать 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);

сначала проверить аутентификацию и авторизацию, но, возможно, это приведет к ненужному выполнению кода.

Оба подхода имеют проблему, заключающуюся в том, что логика проверки обрабатывается в файле маршрутов. Вы должны будете синхронизировать необходимые переменные контроллера в файле маршрутов и позже в файле контроллера.

Наконец, я мог сначала вызвать контроллер и немедленно запустить проверку.

Какая лучшая практика здесь?

1 Ответ

0 голосов
/ 30 июня 2019

Нет необходимости проверять перед авторизацией и авторизацией.Это будет ненужной работой, потому что, если пользователь не авторизован, данные не будут использоваться и не должны проверяться.Вот как работает фреймворк, такой как MEAN или Sail.Вы должны использовать второе решение.

Для информации вы можете сгруппировать маршруты с http://expressjs.com/en/4x/api.html#router

При необходимости вы также можете использовать http://expressjs.com/en/4x/api.html#router.param

// router.js
var Router = require('express').Router();

Router.use('/users', require('./routes/users.js');

module.exports = Router;


// ./routes/users.js
var Router = require('express').Router(),
      auth = [authenticationCheck, authorizationCheck];

Router.param('userId', usersController.param);

Router.route('/')
    .get(usersController.getAllUsers);

Router.route('/:userId')
    .get(usersController.getUserById)
    .put(auth, usersController.updateUserById)
    .delete(auth, usersController.deleteUserById);

Router.route('/signup')
    .get(usersController.signUp);

Router.route('/signin')
    .get(usersController.signIn);

Router.route('/signout')
    .get(authenticationCheck, usersController.signOut);

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