11 KiB
База данных проекта
Проект использует базу данных CouchDB для хранения информации о пользователях, QR-кодах и сообщениях, что позволяет организовать взаимодействие между владельцами QR-кодов и гостями. CouchDB, распределенная NoSQL база данных, которая работает по протоколу HTTP и хранит данные в формате JSON. Это делает её удобной для интеграции с веб-приложениями и клиентскими библиотеками, такими как PouchDB.
Доступ к тестовому серверу CouchDB
Тестовый сервер CouchDB для проекта "НаСвязи" доступен по следующему адресу:
Для управления базой данных и выполнения административных задач доступен встроенный интерфейс CouchDB — Fauxton:
- Админ-панель Fauxton: https://hereconnect.condev.ru/api/_utils/
Использование админ-панели Fauxton
Fauxton — это встроенный веб-интерфейс CouchDB, предоставляющий доступ к функциям управления базой данных, работы с документами, настройки безопасности и мониторинга изменений.
Основные действия в Fauxton
-
Открытие Fauxton:
- Перейдите по адресу https://hereconnect.condev.ru/api/_utils/.
- Введите логин
adminи парольe1oQrcN4QN, чтобы получить доступ к панели управления.
-
Создание базы данных:
- На главной странице выберите "Databases" в боковом меню.
- Нажмите "Create Database".
- Введите имя новой базы данных и нажмите "Create", чтобы завершить создание.
-
Работа с документами:
- Перейдите в нужную базу данных.
- Чтобы создать новый документ, нажмите "Add Document". Введите данные документа в формате JSON и нажмите "Save Document".
- Чтобы отредактировать документ, выберите его из списка, внесите изменения и нажмите "Save Document". CouchDB создаст новую ревизию документа, сохранив изменения.
-
Просмотр журнала изменений (Changes):
- Внутри выбранной базы данных нажмите "Changes", чтобы увидеть все изменения (добавления, обновления или удаления документов).
- Журнал изменений позволяет отслеживать версию каждого документа, что полезно при синхронизации данных и работе с автономными приложениями.
-
Настройка безопасности:
- В разделе "Permissions" можно настроить доступ к базе
Подключение к базе данных с помощью PouchDB
PouchDB — это клиентская библиотека для работы с CouchDB, которая позволяет использовать базу данных как на стороне клиента (в браузере), так и на сервере через HTTP. PouchDB обеспечивает совместимость с CouchDB, так что работа с локальной базой не отличается от работы с удаленной.
Основные операции с PouchDB
npm install pouchdb
```js
// Импорт PouchDB
import PouchDB from 'pouchdb-browser';
// Подключение к базе данных
const db = new PouchDB('https://hereconnect.condev.ru/api/qr', {skip_setup: true});
// или можно использовать локальную базу данных
// const db = new PouchDB('qr');
const qr_code_uri = '4n8x9z7q';
try {
// Создание документа QR-кода
await db.put({
_id: `qr_code:${qr_code_uri}`,
type: 'qr_code',
uri: qr_code_uri,
user_uuid: '01931a8b-220c-76df-943c-ea23313c7c65',
name: 'Мой автомобиль',
actions: ['send_message', 'share_location'],
url: `https://hereconnect.condev.ru/${qr_code_uri}`,
created_at: new Date().toISOString()
});
console.log('QR-код успешно создан');
} catch (error) {
if (error.status === 409) { // Статус 409 означает конфликт (документ уже существует)
console.log(`QR-код с идентификатором ${qr_code_uri} уже существует.`);
} else {
console.error('Ошибка при создании QR-кода:', error);
}
}
// Получение документа QR-кода
const qrCodeDoc = await db.get(`qr_code:${qr_code_uri}`);
console.log('QR-код:', qrCodeDoc);
// Обновление документа QR-кода (например, изменение имени)
const qrCodeForUpdate = await db.get(`qr_code:${qr_code_uri}`);
qrCodeForUpdate.name = 'Обновленное название объекта';
await db.put(qrCodeForUpdate);
// Удаление документа QR-кода
const qrCodeForDelete = await db.get(`qr_code:${qr_code_uri}`);
await db.remove(qrCodeForDelete);
// Создание документа сообщения от гостя
await db.put({
_id: `message:${qr_code_uri}:1731317710358:1731317710358`,
type: 'message',
qr_code: qr_code_uri,
chat: '1731317710358',
created_at: '1731317710358',
from: 'guest',
content: 'Ваша машина мешает проезду',
location: {
lat: 55.7558,
lng: 37.6176
}
});
// Получение всех сообщений для конкретного QR-кода
const messages = await db.allDocs({
startkey: `message:${qr_code_uri}:`,
endkey: `message:${qr_code_uri}:\ufff0`,
include_docs: true
});
messages.rows.forEach(row => console.log('Сообщение:', row.doc));
/ Отслеживание изменений в базе данных
db.changes({
since: 'now',
live: true
}).on('change', change => {
console.log('Изменение в базе данных:', change);
});
// Синхронизация локальной и удаленной базы данных
const remoteDB = new PouchDB('https://hereconnect.condev.ru/api/qr');
db.sync(remoteDB, {
live: true,
retry: true
}).on('change', info => {
console.log('Синхронизация: изменения обнаружены', info);
});
Ревизии документов
CouchDB использует ревизии (_rev) для отслеживания версий каждого документа. Каждое обновление документа создает новую ревизию, которая включает уникальный идентификатор. Это позволяет разрешать конфликты при синхронизации и помогает управлять историей изменений.
Создание новой ревизии происходит при каждом обновлении документа. Ревизия представлена в виде строки, состоящей из номера и хеша (например, 1-9c65296036141e575d32ba9c034dd3ee).
Конфликты ревизий возникают при параллельных изменениях одного документа. CouchDB сохраняет обе версии, и конфликт можно разрешить вручную.
Как работают ревизии
- Создание новой ревизии: При каждом обновлении документа создается новая ревизия. CouchDB использует номера ревизий, которые включают префикс, указывающий версию изменения и хэш-значение, представляющее текущую версию данных. Например, ревизия может выглядеть как
1-9c65296036141e575d32ba9c034dd3ee, где1— версия, а9c65296036141e575d32ba9c034dd3ee— уникальный хэш.
Использование _rev является обязательным для всех операций обновления и удаления документов, так как CouchDB требует указания текущей ревизии для предотвращения конфликтов данных.
При создании нового документа указывать ревизию не требуется. CouchDB автоматически создает поле _rev для нового документа и присваивает ему начальную ревизию, которая обычно выглядит как 1-<хэш> (например, 1-9c65296036141e575d32ba9c034dd3ee).
- Отслеживание изменений:
_revобновляется при каждом изменении документа. Для того чтобы внести изменения в документ, необходимо указать его текущую ревизию, иначе CouchDB вернет ошибку409 Conflict, так как ожидает последнюю известную версию документа.
Пример использования ревизий
import PouchDB from 'pouchdb-browser';
const db = new PouchDB('https://hereconnect.condev.ru/api/qr', { skip_setup: true });
try {
// Получение текущей версии документа
const doc = await db.get(docId);
// Изменение данных документа
doc.name = 'Обновленное название объекта';
// Сохранение документа с новой ревизией
const response = await db.put(doc);
console.log('Документ обновлен:', response);
} catch (error) {
if (error.status === 409) {
console.log('Конфликт: требуется обновить ревизию.');
} else {
console.error('Ошибка при обновлении документа:', error);
}
}
Ревизии в CouchDB помогают обеспечить контроль версий документов, особенно при синхронизации данных и в распределенных системах.