Код Middle HTTP-сервер, Express, NestJS спрашивают часто обновлено

compose: цепочка middleware как в Koa

Условие

Напиши compose(middlewares): возвращает функцию (ctx) => Promise, которая выполняет middleware по очереди. Каждое middleware имеет вид async (ctx, next) => {...}: вызов await next() передаёт управление следующему и ждёт, пока вся оставшаяся цепочка отработает (модель «луковицы»). Если middleware не вызвал next, цепочка дальше не идёт. Повторный вызов next() в одном middleware отклоняется ошибкой с сообщением next() called multiple times. Ошибка в любом middleware отклоняет итоговый промис (и её можно поймать try/catch вокруг await next() выше по цепочке).

Что проверяют тесты

  • порядок луковицы

  • ctx общий

  • без next цепочка обрывается

  • ошибку ловит внешний middleware

  • синхронный throw тоже превращается в отклонение

  • двойной next

  • пустой список

Как подойти

Подсказки: 2
  1. Рекурсивная dispatch(i), которая вызывает middlewares[i] с next = () => dispatch(i + 1).
  2. Запоминай последний вызванный индекс, чтобы поймать повторный next.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.