Создавайте серверы более функциональным способом
Несколько дней назад я начал разрабатывать новый пакет npm для создания HTTP-серверов в Node.js.
Цель состояла в том, чтобы создать более функциональный способ построения серверов. Результат Omicron
. Вы можете проверить это на npm.
Краткое введение
Прежде всего, идите и возьмите Omicron
→ npm 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
, я буду рад это увидеть.
использованная литература
- Библиотека Omicron - https://www.npmjs.com/package/@zaetrik/omicron
- библиотека fp-ts - https://github.com/gcanti/fp-ts
- Библиотека io-ts - https://github.com/gcanti/io-ts