Берем пример сервера 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.