Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将MongoDB服务器数据同步到IndexedDB本地存储_Javascript_Mongodb_Indexeddb - Fatal编程技术网

Javascript 将MongoDB服务器数据同步到IndexedDB本地存储

Javascript 将MongoDB服务器数据同步到IndexedDB本地存储,javascript,mongodb,indexeddb,Javascript,Mongodb,Indexeddb,我正在尝试使用IndexedDB解决脱机问题。它将填充当前存储在MongoDB数据库中的数据(按原样) 一旦数据存储在IndexedDB中,它可能会在MongoDB服务器上更改,我需要传播这些更改。是否有任何现有的框架或库可以为Mongo执行类似的操作。我已经知道CouchDB/PockDB,我不打算研究它们。我没有使用IndexDB,但设计问题并不罕见。我对你的应用程序的理解是,当客户端连接到MongoDB时,你会将一组文档拉下来用于本地存储并断开连接。然后,客户端可以在本地(未连接到数据服务

我正在尝试使用IndexedDB解决脱机问题。它将填充当前存储在MongoDB数据库中的数据(按原样)


一旦数据存储在IndexedDB中,它可能会在MongoDB服务器上更改,我需要传播这些更改。是否有任何现有的框架或库可以为Mongo执行类似的操作。我已经知道CouchDB/PockDB,我不打算研究它们。

我没有使用IndexDB,但设计问题并不罕见。我对你的应用程序的理解是,当客户端连接到MongoDB时,你会将一组文档拉下来用于本地存储并断开连接。然后,客户端可以在本地(未连接到数据服务器)执行操作,然后推送更改

在我看来,你必须处理两种一般情况:

  • 当MongoDB服务器更新并中断与客户端的连续性时,客户端必须
  • 轮询数据(计时器?)或
  • 保持websocket打开,让通知在管道上自由流动
  • 当用户需要将更改的数据推送到管道上时
  • 您可以异步重新连接,检查状态更改(根据业务规则解决冲突)
  • 有一个用于处理冲突的服务器端(轻型)界面(取决于应用程序的复杂性,比较MongoDB中状态更改的时间戳和IndexedDB更新就足够了)

  • 使用resumeToken打开一个。但是,由于我们讨论的是多个不同的数据库,因此无法保证因果一致性。

    [2021年同步解决方案]

    我知道这个问题是专门针对MongoDB提出的,但由于这是一个老话题,我想读者可能会为新应用或重建寻找其他解决方案。我真的可以推荐你去看看,因为它正是你当时想要的

    AceBase是一个免费的、开源的实时数据库,可以方便地在浏览器和服务器数据库之间进行存储和同步。它在浏览器中使用IndexedDB,在服务器上使用自己的二进制db/SQL Server/SQLite存储。脱机编辑在重新连接时同步,并通过websocket(快速!)实时通知客户端远程数据库更改

    除此之外,AceBase还有一个独特的功能,称为“实时数据代理”,它允许您将对内存对象的所有更改持久化并同步到本地和服务器数据库,并允许远程更改自动更新内存对象。这意味着您可以完全忘记数据库编码,像只使用本地对象一样编码。不管你是在线还是离线

    以下示例说明如何在浏览器中创建本地IndexedDB数据库,如何连接到与本地数据库同步的远程数据库服务器,以及如何创建消除进一步数据库编码的实时数据代理。AceBase还支持身份验证和授权,但为了简单起见,我省略了它

    const{AceBaseClient}=require('acebase-client');
    const{AceBase}=require('AceBase');
    //使用IndexedDB存储创建本地数据库:
    const cacheDb=AceBase.WithIndexedDB('mydb-local');
    //连接到服务器数据库,使用本地数据库进行脱机存储:
    const db=new AceBaseClient({dbname:'mydb',host:'db.myproject.com',端口:443,https:true,缓存:{db:cacheDb}});
    //等待远程数据库连接或脱机时准备使用:
    db.ready(异步()=>{
    //为聊天创建实时数据代理:
    const emptyChat={title:'newchat',messages:{};
    const proxy=wait db.ref('chats/chatid1').proxy(emptyChat);//如果聊天节点不存在,请使用emptyChat
    //获取包含实时数据的对象引用:
    const chat=proxy.value;
    //更新聊天室的属性以保存到本地数据库,
    //实时同步到服务器和监控此聊天的所有其他客户端:
    chat.title=`更改标题';
    chat.messages.push({
    来自:“ewout”,
    已发送:新日期(),
    text:`发送存储在数据库中并自动同步的消息从来没有这么容易!`+
    `此消息可能是在我们脱机时发送的。谁知道呢`
    });
    //要监视和处理聊天室的实时更改,请执行以下操作:
    chat.onChanged((val,prev,isremotechchange,context)=>{
    如果(val.title!==prev.title){
    警报(${isRemoteChange?'us':'someone'others}``将聊天标题更改为${val.title});
    }
    });
    });
    

    有关更多示例和文档,请访问npmjs.com

    您应该了解meteor的任何代码是否相关。非常有趣,谢谢。可能是我真正问题的解决方案:编写离线应用程序。你应该回答这个问题,这样如果它确实解决了我的问题,我就可以给你分数。结果是,不支持完整的脱机场景(脱机登录+更改+重新联机时同步到服务器):所以此应用程序永远不会联机运行?是的,但必须可以脱机登录和执行操作。基本上是在本地下载数据库的一部分,并在服务器连接时将更改请求推送到服务器。您知道该字段中可能已经插入的任何内容吗?我们的使用非常简单,因为在本地从未进行过任何更改。用户只能提出推送到服务器并可能被接受的更改请求和/或被拒绝。如果接受,则必须将其推回给客户。因此,在这种情况下,我们永远不能在同一个对象上进行本地和远程更改。在backbone.js领域中可能有一些东西,但这是我所不喜欢的。MongoDB现在支持更改流,允许将更改流提供给客户端程序。看见