我想知道在移动应用中使用PouchDB
作为本地存储而不是localStorage
时,架构应该是什么样子。
此时我习惯将我的应用数据缓存到localStorage
,并在需要时对后端执行API调用以请求或发布数据。后端掌握着所有的逻辑。如:
然后将所有数据存储到关系数据库中。我现在一直在阅读NoSQL数据库,特别是CouchDB
和PouchDB
。所以我想知道这个架构会是什么样子?对我来说,此时出现了三个问题:
PouchDB
可以与远程PouchDB
同步。但是,当使用Javascript构建应用程序时,如何确保人们不会通过“黑客攻击”将数据插入PouchDB
。客户端Javascript?3rd party
的API,那么您只需在Sails.js
附近设置一个CouchDB
后端?答案 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)或使用控制台的“资源”选项卡。