#couchdb #pouchdb
#couchdb #pouchdb
Вопрос:
Я создаю приложение, используя pouchdb и couchdb. Структура такова, что у каждого пользователя есть своя собственная база данных (я активировал опцию для каждого пользователя).
Затем, для упрощения предположим, что существует база данных, которая объединяет данные для всех пользователей, база данных местоположений.
Эта база данных синхронизируется с пользовательскими базами данных.
Для каждой пользовательской базы данных пользователь имеет роль администратора.
База данных местоположений имеет пользователя admin в качестве администратора. Обычные пользователи не добавляются в качестве администратора в эту базу данных. Каждый документ имеет атрибут userId. Синхронизация между userdb и locationdb будет отфильтрована по идентификатору пользователя.
Теперь, когда я вхожу в приложение как пользователь, у меня есть разрешения на запуск синхронизации между, скажем localdb
, на pouchdb и userdb
на couchdb. Поскольку пользователь является администратором в userdb. Пока все идет хорошо.
var remoteUser =
new PouchDB(
'https://domain:6984/' 'userdb-' hex,
{
auth: {
username: 'user',
password: 'password'
}
}
)
db.replicate.from(remoteUser).on('complete', function () {
db.sync(remoteUser, { live: true, retry: true })
.on('change', function (info) {
dispatch('syncPrintQueue')
console.log('sync remote user')
}).on('pause', function () {
console.log('user remote syncing done')
})
})
Но затем из приложения, с которым я хочу синхронизироваться userdb
locationdb
. Как пользователь, я не могу этого сделать. Поэтому я добавляю авторизацию как администратор. И теперь я могу запустить синхронизацию.
var remoteLocation =
new PouchDB(
'https://domain:6984/' 'locationdb-' locationHex,
{
auth: {
username: 'admin',
password: 'password'
}
}
)
remoteUser.replicate.from(remoteLocation).on('complete', function () {
remoteUser.sync(remoteLocation, {
live: true,
retry: true
})
.on('change', function (info) {
console.log('location remote syncing ')
}).on('pause', function () {
console.log('location remote syncing done')
})
})
dispatch('syncCompany', remoteLocation)
},
Проблема в том, что теперь я вошел в систему как администратор в текущем сеансе.
То, что я делаю прямо сейчас, — это хранить информацию о пользователе в localStorage сразу после входа в систему. И я использую это для фильтрации или проверки на диване. Вместо того, чтобы пользователь вернулся из проверки текущего сеанса. Что позволило бы мне правильно фильтровать серверную часть.
Добавление каждого пользователя в общую базу данных в качестве администратора не является вариантом. Итак, единственная идея, которая у меня есть, — перенести все синхронизации и авторизации в промежуточное программное обеспечение, скажем, в rails или node.
Есть ли в couchdb решение для управления этой ситуацией?
Ответ №1:
Стандартная постоянная репликация обычно не масштабировалась для репликации нечастых обновлений из (или в) многих баз данных. Улучшается поддержка циклического выполнения множества постоянных репликаций с использованием планировщика, поэтому вы можете посмотреть на это, чтобы увидеть, достаточно ли этого в настоящее время.
Промежуточным решением стал проект spiegel, в котором есть процессы-прослушиватели, которые просматривают канал _global_changes и сопоставляют имена баз данных по шаблону регулярных выражений, чтобы определить, какие исходные базы данных изменились и нуждаются в повторной проверке одним из его процессов изменения или репликатора.