Один час с Deno

Часть моей утренней субботней рутины – изучение новой технологии, которая кажется мне интересной. Это ограничено одним часом, чтобы я не отвлекался и оставался сосредоточенным.

Обычно все начинается с простого “Hello, World”, чтобы настроить мое окружение, и продолжается знакомством с некоторыми основами экологической системы.

Если это новая среда выполнения или язык программирования, я постараюсь настроить что-то более реалистичное, чем пример hello-world – чаще всего для этого подойдет REST API.

Здравствуйте, Deno!

Deno – это простая, современная и безопасная среда выполнения для JavaScript, TypeScript и WebAssembly, использующая V8 и созданная на Rust.
с официального сайта

Она была создана Райаном Далом, который также является автором Node.js, и хотя она не должна быть заменой, она пытается исправить некоторые недостатки Node.js.

Давайте начнем! Для пользователей mac все, что вам нужно сделать, это:

❯ brew install deno
❯ echo "console.log('Hello, Deno!')" >  hello.ts
❯ deno run hello.ts
Check file:///Users/shikloshi/projects/deno/hello.ts
Hello, Deno!
Войти в полноэкранный режим Выйти из полноэкранного режима

Это рабочее приложение Deno.

Что насчет NPM и node_modules?

Deno был впервые представлен для того, чтобы исправить многие вещи, происходящие в экосистеме Node.js, которые не нравились Райану Далу.

Управление пакетами и npm всегда были спорными темами в сообществе Node.js, но, так или иначе, мы многому научились благодаря этому подходу.

В Deno пока нет настоящего менеджера пакетов, и нет каталога node_modules, в котором хранятся все зависимости вашего проекта.

Если вы хотите использовать Deno сторонние библиотеки, вы можете сделать это через Remote Imports.

⚠️ Это очень обширная и интересная тема, которую я, вероятно, потрачу время на глубокое понимание в будущем.

Мы скоро начнем использовать destjs, поэтому давайте импортируем его в наш файл main.ts и создадим наше приложение:

import { createApp } from "https://deno.land/x/destjs@v0.1.2/mod.ts" // This is a remote import - NEAT

createApp({port: 8000});
Вход в полноэкранный режим Выход из полноэкранного режима

Пока что – createApp – просто инициализируем наше приложение с нашими контроллерами и выставляем конечные точки через oak http-сервер.
Запустив его, мы сможем получить доступ к нашему приложению через localhost:8000.

⚠️ Если вы не знакомы с NestJS – я бы сказал, что библиотека ожидает, что файлы будут расположены в определенном дереве каталогов (тип соглашения над конфигурацией). Например: любой экспортируемый класс из каталога controllers, с вычисляемыми декораторами, регистрируется как конечная точка сервера.

Давайте создадим наш первый контроллер приложения. Проще говоря, контроллер – это место, где определяются наши конечные точки HTTP и где мы вызываем любую бизнес-логику, связанную с этой конечной точкой.

Мы назовем наш первый контроллер controller/plant.controller.ts и пока что он будет выглядеть следующим образом:

import { Controller, Get } from "https://deno.land/x/destjs@v0.2.0/mod.ts" // 3
import { HttpContext } from "https://deno.land/x/destjs@v0.2.0/types.ts";


@Controller("/plants") // (1)
export default class PlantsController {

  @Get("/") // (2) 
  getOne(context: HttpContext) {
    console.log(context.state)
    return { plant: "Monstera", beautiful: true }
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Когда мы вызываем конечную точку этого контроллера http://localhost:8000/plants с HTTP GET запросом, мы получаем в ответ красивую Monstera. Позже мы будем использовать базу данных для хранения наших растений и выполнять над ней некоторые операции.

Давайте увеличим масштаб некоторых вещей:
  • (1) Декоратор @Controller('/plants') – пока что нам нужно знать о нем то, что он создает семейство конечных точек HTTP, доступных в нашем приложении. Здесь мы видим конечную точку /plants.
  • (2) Декоратор @Get('/') для получения растения с помощью HTTP GET запроса к /plants.
  • (3) Удаленный импорт для нашей библиотеки.

Это стандартный NestJS способ свести к минимуму многие кодовые шаблоны, которые мы использовали в Express.js.

Устранение проблем с библиотекой

Вот здесь он должен был запуститься, но произошла ошибка:

❯ deno run --allow-net --allow-read ./main.ts
error: Uncaught (in promise) NotFound: No such file or directory (os error 2), readdir 'middlewares'
  for await (const item of Deno.readDir(name)) {
                   ^
    at async Object.[Symbol.asyncIterator] (deno:runtime/js/30_fs.js:125:16)
    at async readFolder (https://deno.land/x/destjs@v0.2.0/bootstrap/middlewares.ts:8:20)
    at async initializeMiddlewares (https://deno.land/x/destjs@v0.2.0/bootstrap/middlewares.ts:27:3)
    at async createApp (https://deno.land/x/destjs@v0.2.0/mod.ts:19:3)
Войдите в полноэкранный режим Выйти из полноэкранного режима

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

❯ tree -L 2
.
├── controllers
│   └── plants.controller.ts
├── main.ts
└── middlewares

2 directories, 2 files
Вход в полноэкранный режим Выйти из полноэкранного режима

После создания этой структуры каталогов наша команда может успешно выполняться:

❯ deno run --allow-net --allow-read ./main.ts
 Middlewares initialized! 0ms
Check file:///Users/shikloshi/projects/deno/hello-deno/controllers/plants.controller.ts
 Controllers initialized! 2106ms
 DestJS application ready at port 8000
Войти в полноэкранный режим Выйти из полноэкранного режима

Протестируйте его с помощью curl

Используя http-клиент curl, мы можем отправить http-запрос и убедиться, что мы действительно получаем ожидаемый http-ответ:

❯ curl localhost:8000/plants
{"plant":"Monstera","beautiful":true}
Вход в полноэкранный режим Выход из полноэкранного режима

Флаги разрешения

Deno, в отличие от Node.js, по умолчанию не получает разрешений на использование сети и файловой системы хоста.

  • При запуске сервера ему придется использовать сетевые возможности хоста и получать явные разрешения с помощью --allow-net. Я рекомендую вам подробно изучить флаги разрешений при знакомстве с Deno.

Что дальше?

В следующих нескольких главах этого поста мы постараемся:

  • Добавьте уровень персистентности, используя PostgreSQL.
  • Уровень аутентификации с использованием middlewares.
  • Мы также изучим openAPI.
  • Усовершенствуем наш API для выполнения некоторых действительно интересных вещей, таких как сохранение растений в БД и проверка времени последнего полива.

Дальнейшее чтение

Если вам понравилась эта статья и вы хотите углубить свое понимание некоторых базовых концепций. Вот несколько ссылок:

  • Oak server – промежуточное ПО для встроенного HTTP-сервера Deno. ‘destjs’ использует его под капотом.
  • NestJS – удивительный фреймворк поверх Express.js, который “портируется”, так сказать, в Deno. Он имеет отличные концепции и помогает нам писать бизнес-логику поверх хорошо продуманной конструкции.
  • Райан Дал впервые представит Deno – Рекомендуем!

Следите за новостями.

Оцените статью
Procodings.ru
Добавить комментарий