Есть ли способ переместить больше этой логики c в поставщика услуг, не передавая в него res / req?
Как мы уже обсуждали в комментариях, у вас есть операция загрузки, которая является частью бизнес-логики c и частью веб-логики c. Поскольку вы передаете ответ с помощью пользовательских заголовков, это не так просто, как «бизнес-логика c принесите мне данные, и я полностью справлюсь с ответом», как это делают многие операции с базами данных classi c.
Если вы собираетесь хранить их полностью раздельно, позволяя процессу загрузки максимально инкапсулировать, вам придется создать интерфейс с более высокой пропускной способностью между вашим поставщиком услуг и кодом Express, который знает о res
объект, чем только один обратный вызов у вас сейчас.
Прямо сейчас у вас поддерживается только одна операция, и она должна передавать поток по конвейеру. Но код загрузки действительно хочет указать информацию о типе и размере контента (это то, что известно внутри кода загрузки), и он хочет знать, когда выполняется поток записи, чтобы он мог выполнить свои логики очистки c. И что-то, что вы не показываете, - это правильная обработка ошибок, если во время потоковой передачи данных клиенту произошла ошибка (в том числе и с надлежащей очисткой).
Если вы хотите переместить больше кода в загрузчик, по сути, вам нужно было бы создать небольшой интерфейс, позволяющий коду службы выполнять более одной операции с ответом, но без фактического объекта ответа. Этот интерфейс не должен быть потоком полного ответа. На нем могут быть только методы для получения уведомлений о завершении потока, запуска потоковой передачи, установки заголовков и т. Д. c ...
Как я уже говорил в комментариях, вам придется решить, если это на самом деле делает код проще или нет. Правила дизайна не являются абсолютными. Это вещи, которые следует учитывать при выборе дизайна. Они не должны вести вас в направлении, которое дает вам код, который значительно сложнее, чем если бы вы сделали другой выбор дизайна.