- Оригинальный адрес:Как начать с бэкенда TypeScript и использовать весь его потенциал.
- Оригинальный автор:idchlife
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:xilihuasi
- Корректор:tvChan, noahziheng
Как поиграть с бэкендом с помощью TypeScript?
Я представлю несколько отличных библиотек с точки зрения разработчика. Они могут удовлетворить большинство функций вашего серверного приложения. Возможности декораторов и метаданных полностью используются в этих библиотеках, что делает их очень мощными и простыми в использовании.
Я надеюсь, что эта статья поможет таким людям, как я, которые любят TypeScript и хотят писать с его помощью внутренний код, и заставит их, как и меня, получить удовольствие от открытия этих библиотек.
TL;DR — стек делает ваши серверные приложения такими же мощными, как и многие корпоративные статические решения на других языках:
-
Библиотека маршрутов и контроллеров с использованием декораторов, параметров, инъекций тела
-
Библиотеки для внедрения зависимостей и сервисы с использованием декораторов
-
ORM, использующие декораторы, такие как Doctrine/Hibernate, для удобного манипулирования сущностями.
-
Небольшой совет для тех, кто еще не знаком с написанием бэкендов на TypeScript
Маршрутизаторы-контроллеры: контроллеры, действия, запросы и т. д.
Хотя эта библиотека написана как помощник TypeScript для Express/Koa, она также поможет вам написать контроллеры, которые вы бы использовали в корпоративных средах Java/PHP/C#.
Вот небольшой пример контроллера:
import {JsonController, Param, Body, Get, Post, Put, Delete} from "routing-controllers";
@JsonController()
export class UserController {
@Get("/users")
getAll() {
return userRepository.findAll();
}
@Get("/users/:id")
getOne(@Param("id") id: number) {
return userRepository.findById(id);
}
@Post("/users")
post(@Body() user: User) {
return userRepository.insert(user);
}
}
Для некоторых людей это похоже на избавление от кошмара: больше никаких компонентов с маршрутами, полно вложенных промежуточных программ и реализаций промежуточных программ с параметрами инъекции, проверки и запроса (да, вы даже можете определить типы параметров и нужно ли их передавать! Такие как @Body({ required: true, validate: true }) это будет работать хорошо, если есть отсутствующий параметр или неверный запрос, будет выдано исключение)
Декоратор имеет много полезных функций, таких как @Controller базового контроллера, возможность определять тип содержимого в действиях, а также обслуживание и получение JSON с помощью @JsonController.
Я использую его в Express, и теперь, когда у нас есть async/await (я не могу не хвалить разработку TS Node.js в течение нескольких месяцев), нам больше не нужен Koa (контроллеры маршрутизации могут быть лучше, теперь Express поддерживается). И у Express есть больший набор @types.
Вот пример использования роутинг-контроллеров и других библиотек @pleerock (VSCode, если интересно, со ссылкой на плагин TypeLens) в моем проекте:
Как видите, роутинг-контроллеры даже предоставляют неопределенные коды возврата (а также пустые и нулевые декораторы) и многие другие возможности. Об this.playerService — это еще одна интересная библиотека, о которой я расскажу позже.
В целом, у библиотеки есть подробная документация, которая поможет вам понять и создать приложения, которые работают с пользовательским промежуточным программным обеспечением для действий и даже целых контроллеров (отличный момент для меня). Адрес ссылки есть, как видите, очень удобно.
Конечно, вы также можете использовать много промежуточного программного обеспечения Express/Koa для извлечения вашего приложения, а также для настройки представления (в библиотеке также есть декораторы для представлений), аутентификации (которую можно применить ко всему уровню управления через промежуточное программное обеспечение), ошибки обработка и др. Комплектация.
Обычно я храню их в папке /controllers.
TypeDI: внедрение зависимостей, сервисы
Эта библиотека помогает мне структурировать мой проект, упрощает кодирование и не заставляет думать: «Хорошо, а где существует сервис, это сервис? Ну, может, это другой, но как он зависит от другого сервиса? он ссылается на другие сервисы?»
Возвращаясь к моему PlayerService, в этом разделе можно увидеть, от чего он зависит (другие сервисы):
@Inject для меня лучший декоратор, который можно использовать при работе с сервисами и логически завершенными серверными приложениями.
(Если вы хотите узнать о @OrmEntityManager — еще одной библиотеке от @pleerock, я расскажу об этом позже)
Да, у вас может быть много служб, которые зависят от других служб. И если у вас есть циклические зависимости службы, вы можете обойти это, явно определив типы (документация библиотеки охватывает большинство проблем и сценариев).
Для тех, кто не знаком со службами, контейнерами служб, внедрением зависимостей служб и т. д. Короткое описание:
У вас есть какая-то функциональность, вы хотите сохранить ее в классе, затем вам нужен экземпляр класса, и вы хотите, чтобы этот класс зависел от другого, другого и т. д. Внедрение зависимостей сервисного контейнера может сопровождать вас. Вы можете получать службы из контейнера, и он сам будет обрабатывать все зависимости служб, предоставляя вам автоматическое внедрение рабочих экземпляров с другими экземплярами.
Мое описание этой библиотеки не охватывает весь ее потенциал (вы можете сами проверить ее документацию — доступно гораздо больше функций): вы можете дать ей имя при определении сервисов, вы можете определить внедрение конструктора и т. д.
Обычно я храню свои сервисы в папке /services.
TypeORM: используйте ORM для определения реляционных сущностей, разные типы столбцов и разные схемы хранения данных очень удобны (реляционные, нереляционные)
Это дает мне ощущение, что написание Node.js на TypeScript наконец-то может конкурировать с другими языками и ORMS.
Мощный ORM позволяет легко писать сущности в понятной форме. Я не фанат многих других ORMS Node.js, таких как эта:
module.exports = { id: SomeORM.Integer, name: SomeOrm.String({ …})}
Я всегда хочу, чтобы сущности записывались как классы. Класс, которому задано типизированное свойство, будет обнаружен ORM с помощью простого декоратора. Даже не напечатал.
TypeORM дает вам эту возможность. Другой пример из моего проекта:
Как видите, я даже не написал тип свойства в декораторе (вы можете это сделать, не волнуйтесь, укажите тип явно, по умолчанию, с нулевым значением и т. д.)! TypeORM делает всю эту работу за меня, зная, какой тип (благодаря отражению TypeScript: расширения метаданных) и применяя его к моей базе данных.
Это очень мощный инструмент, и у вас будет все, что вы имеете/видите в других ORM, таких как (Doctrine, Hibernate).
При использовании роутинг-контроллеров и TypeDI он предоставляет очень полезные декораторы для внедрения менеджеров сущностей (как вы можете видеть на снимке экрана PlayerService) или подключения ваших контроллеров к сервисам (этоОченьУдобство).
Этот ORM имеет официальную документацию, которая охватывает множество функций, вы можете просмотреть ее и узнать все, что вам нужно знать, чтобы начать ее использовать.
Обычно я помещаю конфигурацию моей базы данных в папку /config, а объекты — в папку /entities.
- Почему в одной статье рассматриваются все эти библиотеки?
Это самое интересное.
Контроллеры маршрутизации — это основа вашего приложения. Это дает вам возможность легко связать эти две библиотеки (см. документацию по библиотеке). Конечно, вы не обязаны, если не хотите. Его можно использовать с любым ORM.
Однако, когда вы используете все три из этих библиотек, вы делаете фреймворк слишком мощным по сравнению с другими решениями (по крайней мере, для меня). У вас есть контроллеры, внедрение параметров, внедрение тела, проверка параметров, внедрение зависимостей, и с этим вы можете забыть о ручном предоставлении зависимостей и определении типов, украшении сущностей свойствами, запросах построителя. Это все о TypeScript! Таким образом, бэкэнд также будет иметь проверку типов во время компиляции!
- Да, благодаря библиотеке, которая охватывает эти функции. Но опять же, как использовать TypeScript с узлом?
Что ж, проще некуда. Вы можете написать машинописный текст как обычно, настроить его для компиляции в ES2015 (теперь в узле много фич, нет необходимости компилировать его в версию до ES2015) и использовать стандарт CommonJS для реализации модулей.
И используйте pm2 или что-то еще, чтобы запустить index/server/app.js после компиляции. В основном производственный код готов. Нет необходимости в ts-узле или что-то в этом роде.
Если вам нравятся эти библиотеки, не забудьте выразить свою любовь
Как видите, мало кто знает о роутинг-контроллерах и TypeDI, это самые мощные и полезные библиотеки, которые я использую для своего проекта TypeScript Node.js. Если они вам нравятся, пожалуйста, найдите секунду, чтобы отметить их и распространить информацию. Они мне очень помогли, поэтому я надеюсь, что они помогут вам и другим пользователям TypeScript!
У этих библиотек также есть сообщества gitter, которые вы можете легко найти, введя в Google «имя библиотеки gitter».
Спасибо за чтение и получайте удовольствие от использования TypeScript. Комментарии или вопросы приветствуются~
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,товар,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.