我已经建立了一个本地CouchDB数据库,我想将它复制到PouchDB数据库,在localhost上运行的网页中使用JavaScript.
使用下面的代码我得到这个错误:
原产地
http://localhost不被访问控制允许来源允许的.
随着http://从远程删除,我没有得到一个错误,但没有文档显示为复制.
从Chrome DevTools查看IndexedDB数据库,我可以看到数据库已经创建(但似乎没有文档).
在Chrome 29.0.1535.2金丝雀中运行.
我可以在本地执行此操作,还是需要设置远程CouchDB数据库并启用CORS(根据CouchDB文档)?
var REMOTE = 'http://127.0.0.1:5984/foo';
var LOCAL = 'idb://foo';
Pouch(LOCAL, function(error, pouchdb){
if (error) {
console.log("Error: ", error);
} else {
var db = pouchdb;
Pouch.replicate(REMOTE, LOCAL, function (error, changes) {
if (error) {
console.log('Error: ', error);
}
else {
console.log('Changes: ', changes);
db.allDocs({include_docs: true}, function(error, docs) {
console.log('Rows: ', docs.rows);
});
}});
}
});
Run Code Online (Sandbox Code Playgroud) 我正在使用pouchDB作为应用程序的本地数据库.我想从PouchDB查询结果并将其加载到React.js中.但是,即使我正在使用waitFor()方法,PouchDB查询的结果也会返回太晚.我想我不明白waitFor()的使用是否正确,也许有人可以对它有所了解.
我有两个商店,DbStore从数据库中检索数据.FileExplorerStore这个商店由我的react组件使用.
DbStore.dispatchToken = AppDispatcher.register(function (payload) {
var action = payload.action;
var folder = payload.action.folder
switch (action.type) {
case 'OPEN_FOLDER':
if (folder === 'start') {
DbStore.init();
}
else {
DbStore.createPath(folder);
}
DbStore.emitChange();
break;
default:
// do nothing
}
return true;
});
Run Code Online (Sandbox Code Playgroud)
DbStore有一个函数LoadFiles,它将DB文件加载到_files数组中.为了便于说明,我复制了以下代码:
loadFiles: function (_path) {
var fileNames = fs.readdirSync(_path);
_files = [];
fileNames.forEach(function (file) {
console.log(file)
db.query(function (doc) {
emit(doc.name);
}, {key: "bower.json"}).then(function (res) {
_files.push(res.rows[0].key)
});
});
},
Run Code Online (Sandbox Code Playgroud)
FileExplorerStore有一个从_files数组中检索文件的方法.然后在FileExplorerStore中我有一个getFiles()方法,它将检索这些文件.但是,此数组始终为空,因为此方法将在填充数组之前执行.
FileExplorerStore
FileExplorerStore.dispatchToken = AppDispatcher.register(function (payload) {
var action = …Run Code Online (Sandbox Code Playgroud) 存储多个用户数据的最佳方法是每个用户每个数据库.我正在使用同样的方法.
我在服务器上有couchdb,移动应用程序有pouchdb.我通过在pouchdb和couchdb中为用户创建单独的数据库来维护每个用户数据.那.这意味着我在couchdb中有多个数据库,在pouchdb中有一个数据库.
通常在sqlbase数据库中,用户数据存储在不同的不同表中.
所以在nosql pouchdb中我正在为每个表创建文档.
我面临的实际问题是:
我在每个数据库中都有一个文档来存储用户的事务.
客户端事务在他/她脱机时以及当应用程序将事务同步到couchdb用户数据库到事务文档时存储在pouchdb中.
数据存储在交易文件中如下
{
"_id":"transaction ",
"_rev":"1-3e5e140d50bf6a4d873f0c0f3e3deb8c",
"data":[
{
"transaction_id":"tran_1",
"transaction_name":"approve item",
"status":"Pending",
"ResultMsg":""
},
{
"transaction_id":"tran_2",
"transaction_name":"approve item",
"status":"Pending",
"ResultMsg":""
}]
}
Run Code Online (Sandbox Code Playgroud)
所有这些事务都在服务器端执行,结果在这些文档中更新.当执行任何新事务时,我将其存储在数据属性的事务文档中.
现在我在pouch和couchdb中有1个事务,两者都意味着两个都是同步的.
现在,当移动应用程序处于脱机状态时,它会执行存储在pouchdb事务文档中的脱机事务.
在服务器端,1个事务更新为成功.
现在当应用程序进入联机和同步执行时,我正在丢失我的服务器端更改,最后事务文档中的数据是客户端pouchdb.
在这里我丢失了服务器端数据.那么什么是好方法或如何解决它.

我希望使用PouchDB - CouchDB来保存我的Web应用程序的用户数据,但无法找到一种方法来控制每个用户的访问权限.我的数据库只包含使用用户ID作为密钥的文档.我知道有一些解决方案:
每个用户一个数据库 - 但是它需要监视新用户何时想要保存数据以创建新数据库,并且可能创建大量数据库;
客户端和CouchDB之间的代理 - 但是我不希望PouchDB同步整个数据库的更改,包括那些_all_docs,_revs_diff请求中的其他用户的文档.
pouchDB的用户访问控制是否有任何建议,用户群约为100万(仅活跃用户约1万)?
我在看Relay/GraphQL.看起来很适合与React一起使用,但我主要担心的是是否可以在离线模式下使用GraphQL.在我目前使用Ionic Framework(基于AngularJs)构建的混合应用程序中,我计划转移到React,Redux.在从服务器获取数据方面,Relay/GraphQL看起来很棒但是当用户离线时如何在移动设备上本地运行GraphQL实例?这是Relay/GraphQL的有效用例吗?截至今天,我使用PouchDB作为我的本地数据库.
我使用的是PouchDB与websql适配器或科尔多瓦的应用程序(我使用SQLite的插件).
注意,这个数据库是完全本地的,我不需要它同步.
对于我的特定应用程序(数据库用于跟踪API调用),我可以多次更新同一文档.
在删除文档并压缩数据库之后,我的数据库仍在增长.
我在删除文档后尝试压缩,尽管它有所不同 - 仍然保存了修订版本的记录 - 所以我的数据库仍然无限增长.
如何阻止数据库无限增长?
删除(通过设置doc._deleted = true然后db.put(doc))和压缩似乎不起作用.
请参阅下面的一条记录,即使我删除它并压缩数据库,它仍会随着所有修订而继续增长:
{
"id": "STATUS_TYPE_WEB_BROADCAST_RESULT_APICALL_5",
"deleted": true,
"rev_tree": [
{
"pos": 1,
"ids": [
"561567a6abccf9e25063be1cff906862",
{
"status": "missing"
},
[
[
"76a29a5ea586f54b86d9f7671fa0938a",
{
"status": "missing"
},
[
[
"00945a90f36790a6e25c3c8c99ecb008",
{
"status": "missing",
"deleted": true
},
[
[
"1844208b140a98fe83ccf547f3da1516",
{
"status": "missing"
},
[
[
"dd56c4b8dfae01cf3eabfad3ea21bf84",
{
"status": "missing"
},
[
[
"9152aac8de2c87c2265cc34ef1e992a9",
{
"status": "missing",
"deleted": true
},
[ …Run Code Online (Sandbox Code Playgroud) 以下代码(使用PouchDB身份验证插件)失败,因为它触发浏览器发送CORS预检请求,而CouchDB不支持OPTIONSHTTP方法.
var db = new PouchDB("http://localhost:5984/mydb");
db.login('username', 'password');
// assume the database URL and login info are valid
Run Code Online (Sandbox Code Playgroud)
这是错误(在Chrome中).请注意,Edge中也会出现此问题,但Firefox中不会出现此问题:
XMLHttpRequest无法加载http:// localhost:5984/_session.预检的响应具有无效的HTTP状态代码405
以下是Chrome为请求发送的标头(在Firefox中没有明显不同):
POST /_session HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 25
Accept: application/json
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://localhost:8080/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8,es-419;q=0.6,es;q=0.4
Run Code Online (Sandbox Code Playgroud)
我已经通过add-cors-to-couchdbNode脚本启用了CORS .我尝试过的事情:
OPTIONS方法[cors]{ ajax: { content_type: "text/plain" } }作为第三个参数传递给login所以,我的问题是: …
我有以下用例/应用程序:
一个TODO应用程序,用户可以:在TODO上CRUD(我正在使用pouchdb/couchdb同步).几乎基于Josh Morony的教程
现在我想添加用户"分享"(仅发布,没有"编辑"/放置)他们的TODO项目与其他用户的能力,他们将能够只查看(读取)那些(没有写访问等).
我正在考虑添加一个单独的数据库(我们称之为"共享TODO数据库"),我的服务器可以在其中编写,所有用户只能读取.因此,任何用户都可能在该只读数据库中执行.find(),而在此处发布时,仍然会在请求共享来自用户的TODO时由服务器进行管理.
这有一种已知的模式(方法)吗?有没有真正的应用程序/示例已经这样做了?
我已经将Pouchdb与Electron一起使用,通过本地LAN连接两个系统并使用作为父级的单个数据库,另一个子系统将使用相同的pouchdb数据库.
使用express-pouch使子系统连接父pouchdb.
父系统中将运行后台同步,从couchDB到pouchDB.
连接正在按预期工作,问题将是在父系统和子级连接系统冻结一段时间之后.检查任务管理器磁盘100%,内存100%.
两个系统 - Windows 10专业版 - Ram - 4GB
我在我的混合(Ionic)应用程序中使用pouchDB从我的Cloudant数据库发送和检索数据.
continuous replication到目前为止我已经习惯了,但是交易太多了,服务器的账单也在增加!
你能帮助我用"最佳实践"重写我的代码以避免这种情况吗?
这样声明远程URL是最好的实践,还是应该有数据库的本地副本?
如您所见,我是pouchDB/couchDB的新手,我不明白如何正确管理复制.
谢谢你的帮助!
.factory('usersDatabase', [
'pouchDB',
function (pouchDB) {
'use strict';
var usersDatabase = pouchDB('boaine_users'),
remote = 'https://ididi:pwdpwd@myaccount.cloudant.com/boaine_users',
opts = {
live: true,
retry: true
};
usersDatabase.replicate.to(remote, opts);
usersDatabase.replicate.from(remote, opts);
return usersDatabase;
}
])
Run Code Online (Sandbox Code Playgroud)