Создавайте серверы более функциональным способом

Несколько дней назад я начал разрабатывать новый пакет npm для создания HTTP-серверов в Node.js.

Цель состояла в том, чтобы создать более функциональный способ построения серверов. Результат Omicron. Вы можете проверить это на npm.

Краткое введение

Прежде всего, идите и возьмите Omicronnpm i --save @zaetrik/omicron. Чтобы следовать примерам из этой статьи, вам также понадобятся fp-ts и io-ts. Вы можете установить их с помощью npm i --save fp-ts io-ts.

Пример простого сервера

Теперь давайте запустим простой сервер, который обрабатывает GET запрос к http://localhost:3000/.

Пойдите и запустите свой файл! Теперь у вас должен быть работающий сервер, который на GET запрос к http://localhost:3000/ отвечает «Hello 👋».

Как вы могли заметить, нам нужно определить две функции-обработчики. Первый обработчик предназначен для входящего запроса, и он получит входящий запрос.
Вторая функция - это обработчик ошибок, который будет выполняться только при возникновении ошибки в вашем обработчике.

Ответ с пользовательскими настройками

Вы также можете отправить ответ с пользовательскими настройками:

Чтобы вернуть ответ с пользовательскими настройками, ваша функция-обработчик должна возвращать что-то с типом RouteResponse. В нашем примере выше мы отправили cookie клиенту с помощью нашего настраиваемого заголовка.

Промежуточное ПО

Omicron также позволяет использовать промежуточное ПО. Вы можете делать действительно крутые вещи с помощью функций промежуточного программного обеспечения.

Вы можете использовать промежуточное ПО с функцией useMiddleware() из Omicron. Эта функция в основном не делает ничего, кроме компоновки функций промежуточного программного обеспечения с вашей функцией-обработчиком.

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

Промежуточное ПО должно принимать входящий запрос и возвращать что-то с типом Either<Error, HttpRequest | unknown>. Также существует возможность написать промежуточное ПО, которое возвращает необработанные данные и выдает ошибку, если промежуточное ПО выходит из строя. Вы можете использовать их с функцией useErrorThrowingMiddleware().

Вот пример промежуточного программного обеспечения, которое возвращает RequestBody внутри Option<RequestBody>:

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

Вы также можете передать несколько промежуточных программ. Они выполняются слева направо. Результат первого промежуточного программного обеспечения будет передан второму промежуточному программному обеспечению и так далее, пока он, наконец, не будет передан вашей функции-обработчику.

Еще один интересный пример для функций промежуточного программного обеспечения - проверка ввода.

Здесь мы написали небольшую функцию-валидатор, которая принимает тип, который мы определили с помощью io-ts, а затем возвращает функцию промежуточного слоя, которая проверяет тело входящего запроса.

Это действительно мощно, потому что теперь мы можем вернуть типизированный объект нашей функции-обработчику, который определенно имеет желаемый тип. Затем мы можем работать с нашими типизированными данными в нашей функции-обработчике.

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

использованная литература