使用CouchDB / PouchDB时应用程序的体系结构

时间:2015-06-10 14:14:59

标签: cordova couchdb ionic-framework sails.js pouchdb

我想知道在移动应用中使用PouchDB作为本地存储而不是localStorage时,架构应该是什么样子。

此时我习惯将我的应用数据缓存到localStorage,并在需要时对后端执行API调用以请求或发布数据。后端掌握着所有的逻辑。如:

  • 此用户是否具有执行此操作的正确权限/角色?
  • 检查是否可以执行操作所需的任何其他逻辑

然后将所有数据存储到关系数据库中。我现在一直在阅读NoSQL数据库,特别是CouchDBPouchDB。所以我想知道这个架构会是什么样子?对我来说,此时出现了三个问题:

  1. 如果我有多个拥有自己身份验证的用户,我该如何确保用户只能访问他们的数据?我在服务器端还有1个数据库吗?
  2. 客户端的
  3. PouchDB可以与远程PouchDB同步。但是,当使用Javascript构建应用程序时,如何确保人们不会通过“黑客攻击”将数据插入PouchDB。客户端Javascript?
  4. 在这些设置中是否会使用后端?如果您想拥有3rd party的API,那么您只需在Sails.js附近设置一个CouchDB后端?

2 个答案:

答案 0 :(得分:9)

PouchDB维护者在这里,很高兴回答您的问题。 :)

  

如果我有多个拥有自己身份验证的用户,我该如何确保用户只能访问他们的数据?我在服务器端还有1个数据库吗?

the pouchdb-authentication README中有一个指南。 Cloudant和Couchbase也有自己的系统来管理用户。

  

客户端的PouchDB可以与远程PouchDB同步。但是当使用Javascript构建应用程序时,如何通过“黑客”客户端Javascript来确保人们没有将数据插入到PouchDB中?

您在服务器端编写validate_doc_update函数。当PouchDB尝试同步到CouchDB时,任何失败的文档都会发出'denied'事件,并且这些文档将不会同步。

对于本地数据库,您无法阻止用户编写错误数据(他们总是可以打开控制台并执行他们想要的任何操作),但您可以使用pouchdb-validation之类的内容来重用验证功能在客户端。或者,您可以在put()文档时自己完成。

  

在这些设置中是否会使用后端?如果你想为第三方提供API,你只需在CouchDB周围放一个Sails.js后端?

有些人在没有后端的情况下编写PouchDB应用程序(只使用纯CouchDB / Cloudant / Couchbase),而其他人喜欢将数据库与他们选择的服务器架构混合在一起。由你决定。 :)

如果您使用Express,一个有趣的解决方案是使用express-pouchdb,这样您就可以在现有架构中公开类似PouchDB Server的端点。但是对于Sails.js,你必须自己编写。

答案 1 :(得分:1)

  

客户端的PouchDB可以与远程PouchDB同步。但是,当使用Javascript构建应用程序时,如何确保人们不会通过“黑客攻击”将数据插入到PouchDB中。客户端Javascript?

为降低风险,您可以删除/重新定义全局变量window.PouchDB。因此,当您的代码启动时(假设它在闭包内运行),它可以执行以下操作:

function(){
    // your closure
    var PouchDB = window.PouchDB;
    window.PouchDB = null;
    Object.freeze(window);
}

现在PouchDB在闭包内可见,但从控制台看不到。

最后一行冻结整个window对象,因此代码在执行冻结后无法添加任何全局变量。收到并初始化所有库后,必须调用Object.freeze(window)。请注意,此技巧可能会产生很多副作用,因此请仔细测试您的代码。

Object.freeze保证用户无法将PouchDB的源代码复制/粘贴到控制台并运行它,但不保证用户无法直接访问底层存储(IDB / WebSQL)或使用控制台的“资源”选项卡。