Берем пример сервера 9-logger и доработаем его:
-
Давайте вынесем в конфиг из примера
9-loggerвсе или часть параметров, которые могут меняться: номер порта, параметры подключения к базе данных, настройки криптографии для хеширования паролей, таймауты и то, что вам покажется полезным перенести в конфиги. Для конфигов мы можем использовать обычный модуль, например, файлconfig.js, рядомmain.js, из которого он подгружается черезrequire. -
В конфиге сделаем ключ
transportс вариантами значенийhttpиws, т.е. мы можем в конфиге переключать, по какому транспорту мы отдаем API. Нужно соответственно поменять код вmain.jsчтобы подгружался илиhttp.jsилиws.jsв соответствии с конфигом. -
Клиентская часть API у нас поддерживает
websocket, но не умеет работать через обычный HTTP. Вот код клиента:client.jsНужно разработать вариант функцииscaffold(динамическое создание интерфейса для работы с серверным API в рантайме), которая бы поддерживала HTTP, лучше всего на базеfetch. Добавим в функцию параметрurl, в результате, ее сигнатура будет:scaffold(url, structure). Если не знаете с чего начать, то может помочь пример функцииbuildAPI, а при необходимости посмотрите дополнительное видео про пересаживание API с HTTP на Websocket, это задача обратная нашей. -
Теперь, на клиенте нужно организовать условное подключение к серверу по
httpилиwebsocketв зависимости отurl, передаваемого в функциюscaffold, т.е. мы должны иметь или две реализацииscaffoldс одинаковой сигнатурой и с разными транспортами или коллекцию транспортов, напримерconst transport = { http:..., ws:... };. По желанию вы можете реализовать то же для протоколовhttpsиhttp2как на клиенте, так и на сервере. Но это не обязательно, принцип переключения уже понятен. -
Можно реализовать подключение фреймворков по такому же принципу, как мы это сделали с транспортами, это тоже по желанию, не обязательно, например
fastifyили любой другой фреймворк и добавить в конфиге параметр:frameworkсо значениямиnative,fastifyи т.д. -
Давайте заменим нашу самодельную систему модульности для написания API на
commonjsили наesm, на ваш выбор. И соответственно отрефакторить все файлы в папке./api. При этом нужно будет реализовать внедрение зависимостей другим способом, на ваш выбор, но без сторонних модулей. -
Так же поступим и с логгером, делаем его пристегиваемым: выносим в конфиги его название, при старте подгружаем нужный и перенаправляем
consoleв него. Можете взять логгер pino.