Я начал изучать Typescript в эти дни, и меня заинтересовал Deno: «Deno — это простая, современная и безопасная среда выполнения для JavaScript и TypeScript, которая использует V8 и построена на Rust». Мне было любопытно, как создать с ним REST API. И мне очень понравился фреймворк Opine: «Быстрый, минималистичный веб-фреймворк для Deno, портированный с ExpressJS». согласно его документам.

В этом руководстве мы собираемся создать REST API, используя Deno, Opine в качестве веб-фреймворка и DenoDB в качестве ORM.

Мы собираемся начать определение нашей модели. Я собираюсь использовать ту же модель из учебника по DenoDB.

Требования:

  • Deno установлен на вашем компьютере (Вы можете установить его здесь).
  • Знание основных концепций ООП (классы, методы, экземпляры).
-----OpineApi
       |------model
       |      |-----Flight.ts
       |------router
       |      |-----Routers.ts
       |------app.ts
       |------db.ts

Мы создаем папку модели в нашем каталоге API и создаем файл модели.

Flight.ts

В Flight.ts нам нужно импортировать типы данных и классы моделей из DenoDB, а затем создать класс Flight, который наследует свойства и методы класса Model. Затем мы назвали нашу таблицу «рейсы» и пометили временные метки как истинные, это будет отображаться, когда мы создаем строку и когда мы ее обновляем.

Затем мы определяем поля нашей модели и ее типы данных, в данном случае: идентификатор, отправление, пункт назначения и продолжительность полета, если мы не укажем продолжительность полета, по умолчанию будет отображаться 2,5.

После этого мы создаем файл в нашем каталоге API, куда мы собираемся подключить базу данных. Я собираюсь использовать SQLite, но DenoDB поддерживает PostgreSQL, MySQL, MariaDB и MongoDB.

db.ts

Нам нужно импортировать базу данных и SQLite3Connector из Deno Db и класс Flight из файла модели.

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

Теперь мы создаем папку маршрутизатора в каталоге API и создаем файл для программирования маршрутизаторов.

Routers.ts

Наш первый маршрутизатор должен использовать для получения всех рейсов в базе данных. Нам нужно создать экземпляр opine, а затем использовать метод get. Мы объявляем неизменяемую переменную как рейсы для хранения всех рейсов, к которым мы можем получить доступ через метод all(), который является методом класса Model, унаследованным классом Flight. Затем он отправляет JSON в качестве ответа. В случае ошибки будет отправлено сообщение об ошибке.

Этот маршрутизатор должен получить рейс по своему id. Мы используем метод where из класса Flight. req.params.id — это метод, который, по мнению авторов, извлекает параметр id из пути. Если рейса с указанным в пути id нет, будет отправлено сообщение Рейс не найден. Если есть рейс, он отправит тело запроса в формате JSON.

В этом маршрутизаторе мы используем метод create для публикации тела запроса. Если сообщение будет успешным, он отправит код состояния «200» и текст, который был опубликован в качестве ответа.

Для обновления мы используем почти тот же код, что и для получения рейса. Разница в том, что мы используем метод обновления.

То же самое применяется к удалению строки из базы данных. Мы используем метод удаления из класса Flight. Эти методы пришли из DenoDb. Код удаляет строку, идентификатор которой указан в пути.

app.ts

В этом файле выполняется сервер. Мы создаем экземпляр opine, чтобы использовать метод «прослушивания» и передавать порт, который будет использовать API. «db.sync()» используется для синхронизации базы данных.

Чтобы запустить сервер, нам нужно написать это в нашем терминале, потому что Deno по умолчанию безопасен:

deno run --allow-net --allow-write --allow-read app.ts

Если у вас есть рекомендации по другим пакетам, как улучшить мой код, мой английский, что угодно; пожалуйста, оставьте комментарий или свяжитесь со мной через Twitter или LinkedIn.

Исходный код здесь

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

Первоначально опубликовано на https://carlosmv.hashnode.dev.