nodejs router.route содержит все промежуточное программное обеспечение asyn c, сам маршрутизатор asyn c? - PullRequest
0 голосов
/ 24 января 2020

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

router.route ("/"). Получить (что-то, что-то другое, one_more_thing)

функции что-то, что-то, что-то, одно и то же, все асин c. и "one_more_thing" возвращает ответ.

означает ли это, что весь router.route () является asyn c. Или мне нужно переключить его на что-то вроде

router.get('/', async (req, res) => {
  try {
    await something
    await something_else
    results = await one_more_thing
    res.json(results)
  } catch (err) {
    res.send(err);
  }
});

ОБНОВЛЕНИЕ :: Добавление фактического кода

Вот мой вызов router.route

    router.route('/clock_in').post(timeClockValidator, isManager, startingOnTime, isClockedIn, clockIn);

Вот timeClockValidator

export const timeClockValidator = async (req, res, next) => {
  logger.info('validating time clock json.');

  let schema = '';
  let results = { errors: [] };

  req.originalUrl === '/api/timeclock/clock_in'
    ? (schema = time_clock_schema)
    : (schema = schema);

  try {
    results = await v.validate(req.body, schema);
  } catch (error) {
    logger.error(error);
    return res.status(400).json('Error");
  }

  return results.errors.length !== 0
    ? (logger.error(results.errors),
      res.status(400).json("Error")
    : next();
};

Остальные функции настраиваются одинаково.

1 Ответ

1 голос
/ 24 января 2020

nodejs router.route содержит все промежуточное программное обеспечение asyn c, сам ли маршрутизатор asyn c?

Да, если задействована какая-либо промежуточная программа или обработчик при обработке входящего запроса он асинхронный, тогда результат будет доставлен асинхронно (на некотором будущем тике события l oop). «Асинхронный» часто называют «заразным» в том смысле, что если что-то в цепочке кода является асинхронным, то весь результат становится асинхронным, потому что, как только любая часть цепочки задерживается до будущего тика события l oop в любой части цепочки конечный результат всегда будет отложен до некоторого будущего тика события l oop.

Это похоже на поездку, в которой участвуют четыре разных поезда. Если один поезд сломается и вы застряли на 24 часа, то вы опоздаете на все последующие поезда в своем путешествии как минимум на 24 часа.

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

Чтобы сделать что-то вроде:

router.route("/").get(something, something_else, one_more_thing)

Оба something и something_else имеют принять аргументы, такие как (req, res, next), и они должны вызвать next(), когда они закончат, чтобы перейти к следующему обработчику в списке для этого маршрута. Они могут быть либо синхронными, либо асинхронными, если они либо вызывают next(), когда они завершают переход к следующему промежуточному программному обеспечению, либо отправляют ответ и останавливают дальнейшую маршрутизацию, не вызывая next().

Это требует совершенно другая функция, чем выполнение таких вещей, как:

router.get('/', async (req, res) => {
  try {
    await something
    await something_else
    results = await one_more_thing
    res.json(results)
  } catch (err) {
    res.send(err);
  }
});

Если something() и something_else() возвращают обещания, как это подразумевается, то вы не можете использовать эти функции в первой форме - вы сможете использовать только им это нравится.

Так вот почему мне сильно не нравятся эти теоретические вопросы без псевдокода и без реального кода (они менее продуктивны для всех). Если вы покажете нам ФАКТИЧЕСКИЙ код для something() и something_else(), то мы сможем точно увидеть, как они написаны, и посоветовать вам, как исправить их для работы в одной из этих форм, или посоветовать, с какой именно формой они работают. .

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