Любая причина не передавать запрос / ответ в качестве параметра? - PullRequest
0 голосов
/ 13 февраля 2019

В экспрессе у меня есть обработчик для маршрута, например:

router.get(`${api}/path/:params/entrypoint`, routeHandler);

В этом примере функция routeHandler имеет много логики, выполняющей различные действия.Я хотел бы разбить routeHandler на более мелкие методы, чтобы упростить читабельность и тестируемость.Таким образом, вместо:

routeHandler(req, res) {
    //many lines of code
}

У нас могло бы быть:

routeHandler(req, res) {
    helperOne(req, res);
    helperTwo(req, res);
}

helperOne(req, res) {
    //do stuff
}

helper2(req, res) {
    //do stuff
}

Мне сказали, что я не должен делать это из-за старшего сотрудника, но я не понимаю, почему.Кто-нибудь знает какие-либо проблемы, которые могут возникнуть при передаче объектов ответа или запроса помощникам?Я не могу думать ни о чем, и Google не дает четкого ответа.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

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

Почему вы передаете res, Вы отправляетеответ изнутри помощников?Не зная подробностей вашей routeHandler реализации, я бы посмотрел, могли бы вы обработать логику в помощниках, но каждый из них должен возвращать значение и сохранять отправку ответа в основной функции routeHandler.Вот простой пример:

handleRoute('/users/:userID', (req, res) => {
  const { userID } = req.params;
  const idIsValid = validateUserID(userID);
  if (!idIsValid) {
    return res.status(400).send('Invalid user ID!');
  }
  ...
});
0 голосов
/ 13 февраля 2019

Кто-нибудь знает какие-либо проблемы, которые могут возникнуть при передаче объектов ответа или запроса помощникам?

Да, при передаче этих параметров могут возникнуть некоторые проблемы, особенно res,Например, вы можете res.send несколько раз (по одному в каждой функции), что вызовет исключение.

Сценарий

Более конкретный пример - это

routeHandler((req, res) => {
    helperOne(req, res);
    helperTwo(req, res);
});

На основев некоторых случаях я хочу остановиться и вернуть ошибку из helperOne, а не выполнять код из helperTwo.Мои определения этих функций таковы:

helperOne = (req, res) => {
    const dataPoint = req.body.dataPoint; // a number for example
    if (number > 10) {
        return res.send("This is not valid. Stopping here...");
    } else {
        console.log("All good! Continue..");
    }
}

helperTwo = (req, res) => {
    res.send("Response from helperTwo");
}

Тогда, скажем, у меня действительно есть req.body.dataPoint = 10, и теперь я ожидаю, что мой routeHandler остановится после return res.send в первом блоке моегоif оператор в helperOne.

Это не будет работать должным образом, потому что return будет относиться только к helperOne, который является возвращающей функцией.Другими словами, не будет распространяться на routeHandler.

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

Решение

  • Не отправлять req или res.Просто передайте необходимые данные и обработайте ответ в вашем основном обработчике
  • Еще лучшей альтернативой является использование Express Middlewares .Поскольку у вас есть несколько «последовательных» обработчиков , вы можете объединить несколько промежуточных программ, что ближе к стандартному способу Express.JS
...