Безопасное увеличение значения с помощью значения поля

В этом руководстве я продемонстрирую, как реализовать счетчик посетителей, который увеличивается при каждом обновлении страницы. Счетчик будет реализован с использованием базы данных Cloud Firestore и веб-приложения на базе Экспресс.

Cloud Firestore - это размещенная служба базы данных документов NoSQL, доступная на Google Cloud Platform. У службы есть уровень бесплатного пользования, который позволяет хранить до 1 ГиБ данных и десятки тысяч операций чтения и записи документов каждый день. И API, и веб-консоль очень просты в использовании.

Атомарное увеличение значения - простая концепция, но легко ошибиться, если вы используете веб-фреймворк, который одновременно обрабатывает несколько запросов, или если ваше приложение развернуто в нескольких экземплярах. В традиционных базах данных SQL вам нужно будет убедиться, что вы читаете, увеличиваете, а затем записываете значение в рамках одной транзакции, чтобы избежать возможной потери данных.

С базой данных NoSQL, такой как Firestore, у вас есть другой вариант: значения полей. Это специальные контрольные значения, которые можно использовать при написании документов с set(), create() или update(). Мы можем использовать значение поля increment(n) для увеличения значения в базе данных без необходимости его предварительного чтения.

Описанный здесь подход должен работать с любым веб-приложением на основе Express, но если вам нужен простой способ следовать за вами, перейдите в Glitch, чтобы сделать ремикс проекта hello-express.

Начнем с добавления модуля @google-cloud/firestore в проект в качестве зависимости. Если вы используете Glitch, выберите файл package.json в редакторе проекта и нажмите кнопку «Добавить пакет», найдите модуль и выберите его, чтобы добавить в проект.

Затем мы создаем базу данных Firestore и проверяем, что учетные данные учетной записи службы базы данных заданы как значение переменной среды FIREBASE_SERVICE_ACCOUNT. Ознакомьтесь с этим руководством для получения пошаговых инструкций.

Затем мы добавляем в server.js следующий код:

Этот код инициализирует объект базы данных Firestore с учетными данными, считанными из переменной среды FIREBASE_SERVICE_ACCOUNT. Затем код инициализирует документ с пустым объектом, если он еще не существует. Затем код определяет функцию для увеличения счетчика и возврата нового значения. Эта функция использует значение поля increment(n) для обновления значения без его предварительного извлечения. Наконец, код определяет обработчик для маршрута /count, который вызывает функцию и возвращает увеличенное значение.

Затем мы добавляем следующую разметку к index.html:

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

Наконец, мы добавляем в script.js следующий код:

Этот код выбирает значение из маршрута /count при загрузке страницы, а затем устанавливает его как значение диапазона visitorCount.

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