Deno + mongodb фактический бой наступает на яму

внешний интерфейс deno
Deno + mongodb фактический бой наступает на яму

С момента выхода deno 1.0 было много статей о deno, в большинстве из которых обсуждается как установить deno, каковы характеристики deno, в чем сходство и различие между deno и node, является ли deno заменой node , так далее. Мы не будем обсуждать это сегодня, ведь Talk стоит дешево, покажите мне код! Испытайте острые ощущения от разработки deno и используйте deno для создания приложения «уровня предприятия»:deno-supermarket, разве это не ароматно?

Некоторые общие ямы в дено

Перед самим боем позвольте мне представить несколько ям, с которыми я столкнулся, когда впервые столкнулся с дено.

Проблема с расположением маркера разрешения

Все мы знаем, что deno по умолчанию безопасен, а это значит, что доступ к сети, чтение и запись файлов и т. д. по умолчанию запрещены. Например, есть файл index.ts со следующим содержимым:

import { serve } from "https://deno.land/std@0.50.0/http/server.ts";
const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
  req.respond({ body: "Hello World\n" });
}

Если выполняется напрямуюdeno run index.ts, сообщит об ошибке:

error: Uncaught PermissionDenied: network access to "0.0.0.0:8000", run again with the --allow-net flag

Так что мы естественно добавим в конце команды запуска--allow-net,следующим образом:

deno run index.ts --allow-net

Однако это все равно выдает ошибку. Я проверил данные, чтобы узнать,--allow-net,--allow-readТакие флаги нельзя ставить после имени файла, за ними сразу должен следоватьdeno runПозже, например, верно следующее:

deno run --alow-net index.ts

Почему нельзя изменить позицию? Ответ на этот вопрос заключается в том, что если--allow-netПосле имени файла оно передается скрипту js, а не deno. Чтобы узнать больше, см. этоconfused by order of cli option flags. В любом случае, помните одно: флаг разрешения должен следоватьdeno runПозади!

Поскольку большинство наших фронтенд-студентов редко пишут предысторию, они не очень хорошо понимают важность безопасности.Чтобы избежать различных проблем с правами доступа, я предлагаю при написании некоторых практических проектов использоватьdeno run -Aчтобы включить все разрешения. (Это только для отладки, и его следует использовать с осторожностью в производственной среде!)

нестабильный API

Поскольку в реальном боевом процессе используется mongodb, необходимо внедрить сторонний модуль Denomongo, однако при запуске проекта будет сообщено об ошибке:

error: TS2339 [ERROR]: Property 'openPlugin' does not exist on type 'typeof Deno'.

Я проверил и обнаружил, что это было потому, чтоopenPluginЭтот метод в настоящее время не является стабильным. По умолчанию deno предоставляет только стабильный API. Если вам нужно включить нестабильный API, вы можете добавить--stableлоготип. Например:

deno run -A --unstable index.ts

Кто-то может спросить,-Aа также--unstableНе будет ли проблем со сменой положения. Проверил этот без проблем. Пока идентификатор предшествует имени файла, он будет работать.

Существует, в конце концов, что такое стабильный API, что такое нестабильный API? На самом деле, официальные документы deno помогли нам разобраться, адрес входа:

если ты сомневаешься--unstable, вы можете использовать следующий метод для распечаткиDenoВсе участники на:

console.log(Object.keys(Deno).length)

использоватьdeno run --unstable index.tsРезультат вывода 117, используяdeno run index.tsРезультат вывода 88 . Это показывает, что существует 88 стабильных API и 29 нестабильных API.

Несколько советов по использованию deno

Переход с узла на deno также изменит наше мышление в области разработки. Итак, давайте взглянем на некоторые навыки разработки deno, которые отличаются от node.

Как управлять версиями?

Сначала я тоже очень растерялся: не болееpackage.json, Как контролировать версию каждой зависимости? Например, у нас есть 10 файлов, которые все зависят отmongo@v0.0.6, то каждый файл импортируется со следующим кодом:

 import { init, MongoClient } from 'https://deno.land/x/mongo@v0.6.0/mod.ts'

Но однажды я вдруг захотел обновить 0.6.0 до 0.7.0, что мне делать? Легко пропустить замену файлов по одному, конечно, можно и глобально искать и заменять пачками. Но эта эффективность не очень высока.

Официальная рекомендация - использоватьdeps.tsфайл для импорта удаленных файлов и управления версиями. (Конечно, имя файла не обязательно должно называтьсяdeps.ts, вы можете изменить его на другое имя). Конкретный метод заключается в том, чтобы поместить все удаленные зависимости, используемые вdeps.tsвведено в , иRe-exportозначает экспортировать каждую зависимость, затем другие файлы могут быть загружены изdeps.tsполучить необходимые зависимости.

Возвращаясь к тому, что все 10 файлов зависят отmongoпроблема, если изменить наdeps.tsФайл для единого управления выглядит так:

export * from 'https://deno.land/x/mongo@v0.6.0/mod.ts'

Тогда те файлы, которые нужно использовать монго, нужно импортировать не напрямую с пульта, а изdeps.tsимпортируется следующим образом:

import { init, MongoClient } from '../pathTo/deps.ts';

Если нам нужно обновить, мы можем напрямую поставитьdeps.tsВнутри адреса Mongo в0.6.0изменить на0.7.0Вот и все.

Кроме того, один момент, похожий на npm, заключается в том, что если номер версии не указан, то есть в удаленном адресе не указана версия, например:

export * from 'https://deno.land/x/mongo/mod.ts'

Последняя версия зависимостей будет установлена ​​по умолчанию.

Как найти библиотеки deno, которые мне подходят?

Используя node, вы можете найти некоторые библиотеки на npm. У deno тоже есть аналогичная платформа, которая на данный момент разделена на две библиотеки, одна из которых является официальным стандартом, а другая — сторонней. Стандартную библиотеку можно найти здесь:Deno Standard Modules. Сторонние библиотеки можно найти здесь:Deno Third Party Modules

Настоящий бой: используйте deno для разработки системы торговых центров с дополнениями, удалениями и изменениями.

Хорошо, с указанными выше очками знаний теперь вы можете сражаться. В первую очередь нужно убедиться, что на вашем компьютере установлена ​​deno 1.0. Кроме того, поскольку используется mongodb, вам необходимо установить mongodb на свой компьютер.

интерфейс

Давайте сначала взглянем на интерфейс нашего магазина:

Хоть воробей и маленький, но у него есть все внутренние органы! Он имеет функции добавления продуктов, запроса продуктов, удаления продуктов и изменения продуктов. Это типичная система стилей REST API.

Структура проекта

Затем взгляните на структуру проекта:

  • .deno_plugins: это библиотека динамической компоновки, загружаемая модулем mongo, не обращайте на нее внимания.
  • config/db.ts: это соответствующий файл конфигурации для подключения к mongodb. Текущий записанный номер порта — 27017, если ваш порт mongodb не такой, вы можете изменить его в этом файле.
  • controllers/goods.ts: это логический код для добавления, удаления, проверки и изменения
  • public/index.html: Это внешняя статическая страница. Она не имеет ничего общего с deno. Нам нужно использовать deno только для обслуживания каталога.
  • deps.ts: используется для управления удаленными библиотеками зависимостей, а затем реэкспортирует их для использования другими файлами.
  • Файл входа server.ts аналогичен файлу входа app.js, когда мы используем epress или koa.

Выбор зависимых модулей

Поскольку проект включает в себя переднюю и заднюю часть, если вы используете узел, вы обычно выбираете экспресс или коа. Точно так же, когда мы используем deno, нам также нужно выбрать соответствующий фреймворк, иначе с http-сервисами и скачками маршрутизации не так просто справиться. Для таких фреймворков на deno больше помеченныхoakа такжеabc, здесь мы решили использовать abc.

Кроме того, поскольку используется mongodb, также необходимо ввестиmongo

заключительные замечания

Хорошо,это я написал для первого опыта Deno.Конкретный код выкладывать не планирую.Заинтересованные могут зайти на Github View:

Если у вас есть какие-либо вопросы, вы можете поделиться ими и учиться вместе~