Node.js + CouchDB与CouchDB

时间:2011-12-08 22:02:20

标签: node.js couchdb

我在质疑自己为什么要使用Node.js + CouchDB与CouchDB独立方法的组合。将Node.js加入游戏有什么好处?欢迎提出任何意见/经验。

5 个答案:

答案 0 :(得分:16)

还有第三种选择:CouchDB在前面,Node.js在后面......

传统上,数据库位于后端,而不是前端,因此这种配置看起来有点“向后”,但是听我说......

在此配置中,您仍然可以从CouchDB(而不是Node)提供所有页面,并使用Node作为一种“工作进程”,轮询数据库中的“作业”,处理它们并插入“结果”回到数据库中。通过这种方式,您可以使用Node的全部功能进行特殊处理,但是您可以从CouchDB中获得为应用程序提供服务的所有好处。

实际上,在这种配置中,您可以拥有运行Python或Java或Ruby等任何类型的专业工作者。例如,假设您的网站上有“创建PDF”功能,并且您希望使用Python来实际创建PDF。您只需编写一个python程序,查看CouchDB中的任何“PDF_Request”文档,处理它们,然后将PDF文件插回到CouchDB中。你没有用Python编写你的整个应用程序,你可以用Python编写你的PDF Create函数,并保持你应用程序的其余部分不变。

现在,假设您将CouchApp复制到另一台计算机或移动设备(运行CouchDB但不运行Node或Python)没问题,您仍然可以在CouchDB中插入“PDF_Request”。当您最终与服务器同步时,您的PDF请求将由pdf创建者程序查看和处理,您将获得PDF文件。你的couchapp仍然在复制的CouchDB上运行,即使那里没有“帮助程序”,因为它们与主应用程序完全分离。

我并不是说这是“要走的路”,只是因为CouchDB的性质,这种配置实际上是一个可行的选择,并且会为您带来扩展和复制的好处,如果你不能把Node放在前面,把CouchDB放在后面。

答案 1 :(得分:7)

Node可以做什么,而CouchDB不能

Node.js可以使用unix套接字进行进程间通信,实时文件上传,可以启动websocket服务器甚至是SPDY服务器。
您可以创建DNS服务器,甚至可以处理一些地理位置定位(MaxMind db)。

CouchDB可以做的好事

然而,使用CouchDB可以做很多有趣的事情,即使它们有点难以实现。例如,使用_changes功能,您可以进行进程间通信,即实时聊天系统(长轮询)。

我不是专家(但CouchDB是我的学习列表的首要任务),但我想你也可以模拟登录用户的会话。

CouchDB很棒,Node.js也是如此,所以重要的是你计划开发什么应用程序,你的用例是什么。

答案 2 :(得分:3)

尼克的回答是一个特别有趣的答案。为了强调这种方法,这里有Mikeal Rogers在CouchOne(?)工作的视频,建议使用couchdb + node-behind方法:http://nosql.mypopescu.com/post/2896329122/node-js-couchdb-crazy-delicious

另一方面,我认为有一个领域即使是那种创新方法也会失败,而且安全性更高。基本安全级别工作正常,但如果您希望内容受更复杂的安全级别控制,则couchdb的map-reduce不会减少。但是,一些简单的node.js可以。

因此,出于某些安全原因(即,为了避免不安全的map-reduce结果),node.js可能在前端更好地实现这些安全措施。

FYI。

答案 3 :(得分:2)

沙发独自(couchapp):

显然,couchdb可以做很多很酷的离线内容 - 例如用户离线,继续,并在重新连接时同步。我还没有理由使用这个功能,但它对手机网络应用程序很有意义,我很期待有一个去:

http://googlecode.blogspot.co.uk/2009/09/chris-anderson-couchdb-relaxing-offline.html

node.js旨在运行服务器端,因此它不适合这个用例,除了在nick perkins的答案中描述的体系结构。

节点+沙发

如果你做的不仅仅是一个简单的js app,节点有一个充满活力的社区,各种各样的库和包可以做任何事情。

这种方法还允许您隐藏在防火墙后面的沙发,并且只允许人们通过您的节点应用与它通话。

答案 4 :(得分:0)

在CouchDB数据库之前使用NodeJS的好处之一是,在实现约束时您将获得更大的灵活性。

CouchDB仅允许您在设计文档中编写验证功能,以检查正在创建/更新/删除的文档。无法从设计文档中访问存储在数据库中的其他文档。

如果需要在插入Y之前检查文档X是否存在,则可能需要此功能。