我正在使用pouchdb和couchdb构建一个应用程序。结构是每个用户都有自己的数据库(我已经激活了每个用户选项)。
然后,为了简化,假设有一个数据库,该数据库聚集了所有用户的数据,即位置数据库。
此数据库与用户数据库同步。
对于每个用户数据库,用户都具有admin角色。
位置数据库具有管理员用户admin。常规用户不会作为管理员添加到此数据库。每个文档都具有userId属性。userdb和locationdb之间的同步将按userID筛选。
现在,当我以用户身份登录应用程序时,我有权限启动pouchdb上的localdb
和couchdb上的userdb
之间的同步。因为用户是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
。作为用户,我不能这样做。所以我添加了auth作为管理员。现在我可以启动同步。
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)
},
问题是现在我在当前会话中以admin身份登录。
我现在做的是在登录后将用户信息存储在localStorage上。我使用它来过滤或验证couch。而不是用户从检查当前会话返回。这将允许我正确地过滤服务器端。
将每个用户作为admin添加到通用数据库中是不可行的,所以我唯一的想法是将所有的同步和授权转移到一个中间件中,比如说Rails或Node。
couchdb中是否有解决方案来管理这种情况?
1条答案
按热度按时间ecfsfe2w1#
标准的持久性复制通常不能扩展到从(或向)多个数据库复制不频繁的更新。它已经得到了改进,支持使用调度程序在多个永久性复制之间循环,所以你可以看看它目前是否足够。
临时解决方案是spiegel project,它具有监听器进程,这些进程观察_global_changes提要并通过regex模式匹配数据库名称,以确定哪些源数据库已更改,需要由其更改或复制器进程之一重新检查。