6

我玩 CouchDB 和 CouchApp 已经有一段时间了。我计划将它用于我正在处理的新网站项目。

  1. 从可扩展性的角度来看,我喜欢 CouchApp 的想法。

    缺点是在没有服务器端代码的情况下,有些事情(如 oAuth 身份验证)在客户端很难做到。在某些时候,我确信我需要一些描述的服务器端代码——我想你可以看看 Node.js,但现在不想。

  2. 将 CouchDB 纯粹用作后端解决方案,而您的页面是从另一台服务器提供的,这也是一个很好的选择,但这里的缺点是跨域问题使您无法轻松使用内置的 CouchDB API。

那么有人有解决这两个缺点之一的方法吗?

您能否以某种方式从 CouchApp 提供服务器端代码(即使是 PHP 也是一种胜利),或者您能否以某种方式使用单独的站点来提供您的页面但克服跨域问题?

我真的在努力使解决方案尽可能干净(并且尽可能可扩展),而 CouchDB 的一大优点是超级简单、超级快速的 API,所以我真的不想在它周围使用包装器 - 除非它没有'不妨碍性能/可扩展性。

欢迎您提出意见。

4

2 回答 2

16

因为 CouchDB 使用基于 HTTP 的 API,所以有多种方法可以将服务器端代码(node.js、PHP 等)与您的 CouchApp “混合和匹配”。

我将选项分为三类:

  1. 首先,您现在拥有的是 2 层架构:由 CouchDB 提供的 Browser + CouchApp。对于只需要浏览器和 CouchDB 可以提供的应用程序来说,这是一个很好的解决方案,但是一旦您需要发送电子邮件、调整图像大小或从另一个不需要的数据库获取数据,您就需要另一层有一个 HTTP API(MySQL、MongoDB 等)。
  2. 接下来是 3 层架构:浏览器 + Apache/PHP(或类似堆栈)+ CouchDB。这是更“传统”的选项(即 LAMP)。这对于逐渐迁移到 CouchDB 来说很好,但从长远来看,必须通过第二个 HTTP 服务器(也许作为代理)或像 PHP 这样的服务器端脚本语言来路由所有内容会变得很麻烦。
  3. 最后,也是我最喜欢的,是 2.5 层架构:浏览器 + CouchDB + 外部或 _changes 基于提要的“操作”。在这种情况下,PHP(或类似的)充当 CouchDB 的某种服务提供者。可以通过让 PHP 监视某些类型的文档及其更改(即图像上传、电子邮件文档)的 _changes 提要来触发操作,或者可以将 CouchDB 设置为“ping”一个 _external 处理程序以对文档进行进一步处理或其附件。这本质上是 couchdb-lucene 的工作方式,通过观察更新并在更新发生时或定期对其采取行动。

您可以在下面找到有关 _changes 提要和 _external 处理程序的更多信息:

对于它的价值,我将在本周三的PHP 和 CouchDB 网络广播中讨论这三个选项。您的问题将成为网络直播结束时讨论的宝贵补充。

我很想知道您的 CouchApp 的结果如何,以及您如何解决上述问题。

于 2010-11-14T05:22:18.157 回答
1

来自 BigBlueHat 的出色回答,但我还有另外一种可能的选择:

克服跨域问题,从而允许您从任何类型的 Web 服务器提供页面,并允许浏览器直接与 CouchDB(可以在另一台服务器上)交互。

由浏览器强制执行的跨域限制并不难解决。我知道的两种主要方法是:JSONP 和 CORS。

JSONP 将每个请求伪装成“脚本”请求(因为脚本请求不受跨域规则的约束)。它仅适用于 GET,不适用于 POST 或 PUT 或其他任何东西。你可以用 jQuery 来做。

CORS 是“跨源资源共享”,它只是一个特殊的 HTTP Header,必须在服务器(本例中为 couchdb)上实现,它告诉浏览器它没问题——它不介意服务来自另一个域。我已经对此进行了测试,它确实有效,但可能存在安全问题——我不确定。

所以......我不知道这是否是一个好主意,但在技术上(至少部分地)克服 CouchDB 的跨域限制在技术上是可能的。有没有人使用这种类型的设置构建过系统?

于 2011-08-10T15:17:59.577 回答