Сохраняйте спокойствие и продолжайте кодировать с Cosmos и Node.js

Кодировать с помощью Cosmos DB SDK - это хорошо. Да, я сказал, чувствует хорошо. Да, да… это быстро устанавливается, быстро обучается и быстро выполняется. Но больше всего он кажется приятным.

Подумайте о том, когда вы кодируете, и все просто течет для вас. Приятно быть в ритме, выкидывать все из головы, вставлять в код и работать плавно! Ключевым моментом в этом является то, что API-интерфейсы, которые мы кодируем, интуитивно понятны и просты в использовании. Именно здесь Cosmos DB SDK проявляет себя наиболее ярко. Посмотрим почему.

Я хочу развлечься с кодом прямо сейчас

Пакет SDK Cosmos DB великолепен, отлично себя чувствует, и если вы тоже хотите чувствовать себя отлично, не читая это, и попробовать все это сами - вот ссылки, с которых можно начать. Я могу плакать, если вы пропустите это чтение, но я переживу это.

Спокойный, крутой, собранный код

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

Когда мы пишем код, мы знаем, что хотим. Например, недавно мне понадобился список героев из моей базы данных - просто дайте их мне, не заставляя меня так много работать! Строка кода, которая дает мне их с Cosmos DB SDK, проста:

container.items.readAll().toArray()

Есть контейнер для моих героев, и в нем есть предметы (мои герои). Так что прочтите их и верните в виде массива, пожалуйста. Теперь это было не так уж и сложно!

Cosmos DB с экспресс-маршрутами

Итак, как это работает в контексте маршрута Node и Express для HTTP-запроса? Давай подумаем.

Сначала нам нужно настроить базу данных. Мы сделаем это в другом модуле, чтобы мы могли быстро избавиться от него и импортировать.

Потом получаем героев. Хорошо, у нас уже есть эта строка кода сверху. Этот код является асинхронным, поэтому мы рассмотрим возможность использования обещаний или async / await. Это ваш выбор, так что выбирайте с умом. Использование async / await - это то, что мне нравится, поэтому мы этим и займемся здесь. Вот как это будет выглядеть, когда я вытащу result и переименую его heroes.

const { result: heroes } = await  container
      .items
      .readAll()
      .toArray();

Наконец, если это сработает, нам нужно добавить героев в ответ с кодом состояния. В случае сбоя мы возвращаем код состояния сбоя и сообщение.

Вот код, который я написал для этого. Не стесняйтесь одолжить его (просто верните его, когда закончите, пожалуйста, чтобы другие тоже могли его одолжить).

//hero.service.js
const { heroes: container } = require('./config').containers;
async function getHeroes(req, res) {
  try {
    const { result: heroes } = await  container
      .items
      .readAll()
      .toArray();
    res.status(200).json(heroes);
  } catch (error) {
    res.status(500).send(error);
  }
}

Это было просто. Как безумно легко! Мы просто написали код доступа к базе данных и в несколько строк подключили его к экспресс-маршруту.

Хорошо, была та одна строка, которую мы вставили для конфигурации. Нам нужно будет это написать, но хорошая новость заключается в том, что настройку нужно выполнить только один раз. Фиксированная стоимость - это единовременная вещь, которую можно повторно использовать столько функций, сколько вам нужно. Другими словами, мы можем писать функции, чтобы получать, размещать, публиковать, удалять героев, злодеев и все, что мы хотим, и нам нужна только эта единственная строка вверху, чтобы настроить это!

Изоляция конфигурации

Вот модуль, который поможет вам начать работу. Мне нравится изолировать функции, которые настраивают мою среду кодирования для подключения к базе данных, в одном модуле узла. Здесь у нас есть тот, который мы могли бы назвать config.js или giraffe.js. Я думаю, что первое имеет больше смысла, но вы понимаете.

Комментарии объясняют, что здесь происходит, но давайте все равно рассмотрим. Сначала мы ссылаемся на модуль Cosmos из пакета @azure/cosmos npm. Затем мы настраиваем ключи, URL-адрес и имя базы данных. Это объединяет все наши конфигурации в одном месте. Наконец, мы создаем экземпляр клиентского объекта Cosmos и открываем объекты-контейнеры. Эти объекты-контейнеры мы будем импортировать в другие модули, поэтому мы можем просто запросить контейнер, и он будет работать. Да, это так просто.

// config.js
// Get the npm module for Azure's Cosmos
const cosmos = require('@azure/cosmos');
// Identify your database keys and name
const endpoint = process.env.CORE_API_URL;
const masterKey = process.env.CORE_API_KEY;
const dbDefName = 'vikings-db';
// Instantiate the Cosmos client object,
// which is the focal point of interacting with Cosmos
const { CosmosClient } = cosmos;
const client = new CosmosClient({ endpoint, auth: { masterKey } });
// Make it easy to acces the containers
const containers = {
  heroes: client.database(dbDefName).container('heroes'),
  villains: client.database(ddDefName).container('villains')
};
module.exports = { containers };

Попытайся

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

Вот несколько ссылок, с которых можно начать

Нравится этот пост? Хлопайте, нажимайте, и я поделюсь другими советами.