Безопасное увеличение значения с помощью значения поля
В этом руководстве я продемонстрирую, как реализовать счетчик посетителей, который увеличивается при каждом обновлении страницы. Счетчик будет реализован с использованием базы данных 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
.
Ознакомьтесь с живым примером счетчика посетителей. Каждый раз, когда вы перезагружаете страницу, число должно увеличиваться.