如何从 couchdb 运行服务器端代码?

Posted

技术标签:

【中文标题】如何从 couchdb 运行服务器端代码?【英文标题】:How do I run server-side code from couchdb? 【发布时间】:2010-08-11 21:12:54 【问题描述】:

Couchdb 非常擅长存储和提供数据,但我在掌握如何使用它进行后端处理时遇到了一些麻烦。例如,GWT 开箱即用地支持同步和异步回调,允许您在服务器上运行任意 Java 代码。有没有办法用 couchdb 做这样的事情?

例如,当用户单击 Web 应用程序的按钮时,我想生成并提供 PDF 文件。理想情况下,工作流程应如下所示:

用户输入了一些数据 用户点击生成按钮 调用服务器,并在服务器端生成 PDF。服务器代码可以用任何语言编写,但最好是 Java。 PDF 生成完成后,系统会提示用户下载并保存文档。

有没有办法使用开箱即用的 couchdb 来做到这一点,或者是否需要一些额外的第三方软件在 Web 客户端和后端数据处理代码之间进行通信?

编辑:看起来我在解释我的问题方面做得很差。我感兴趣的本质上是从 Couchdb 提供 servlet,类似于您可以从 war 文件中的侧面网页提供 Java servlet。我使用 GWT 作为示例,因为它支持一起开发 servlet 和客户端代码并将所有内容编译到单个 war 文件中。我会对这样的事情非常感兴趣,因为它可以通过 Couchdb 复制轻松部署功能齐全的网站。

但是,从表面上看,我的问题的答案是否定的,您不能从 couchdb 提供 servlet。数据库是为 CRUD 样式交互而设置的,任何 servlet 样式的组件都需要单独提供服务,或者通过轮询数据库的更改并采取相应措施来完成。

【问题讨论】:

【参考方案1】:

以下是我建议的一般工作流程:

    当用户单击“生成”时:序列化他们输入的数据和任何其他相关元数据(例如优先级、用户名)并将其作为新文档发布到 couchdb。跟踪文档的 _id。 编写一个后台进程,用于监控 couchdb 中需要处理的文档。 当它看到这样的文档时,让它生成 PDF 并将其附加到同一个沙发文档中。 现在回到客户端。您可以使用 ajax 轮询重复获取沙发文档并测试是否有附件。如果是,那么您可以向用户显示下载链接。

当然,魔鬼在细节中......

您的后台进程可以通过两种方式识别待处理文档:

使用_changes API 监控新文档,_rev 以“1-”开头 在仅返回没有“_attachments”属性的文档的 couchdb 视图上发出请求。当没有要处理的文件时,它不会返回任何内容。 可选:如果您有多个 PDF 制作进程在队列上并行工作,您将需要使用 "being-processed":true 之类的属性更新沙发文档,并将它们过滤掉视图。

其他一些想法:

我不建议在此用例中使用 couchdb 外部 API,因为它(基本上)意味着 couchdb 和您的 PDF 生成代码必须在同一台机器上。但这需要注意。 我对 GWT 一无所知,但似乎没有必要实现您的目标。当然,CouchDB 可以提供您想要的任何静态文件(js 或其他)作为数据库或文件系统中文档的附件。您甚至可以将 eval() JSON 属性放入沙发文档中。因此,您可以使用 GWT 进行 ajax 调用或其他任何操作,但 GWT 可以与 couchdb 完全分离。那样可能会更简单。

【讨论】:

【参考方案2】:

GWT 有两个部分。一个是 GWT 编译器转换为 Java 的客户端,另一个是 Servlet(如果您执行任何 RPC)。通常,您会在浏览器上运行您的客户端代码,然后当您进行任何 RPC 调用时,您会联系 Java Servlet 引擎(例如 Tomcat 或 Jetty 或...),这反过来又会调用您的持久层。

GWT 确实能够通过 HTTP 执行 JSON 请求,巧合的是,这正是 CouchDB 所使用的。所以理论上应该是可以的。 (不知道有没有人试过)。会有几个问题。 CouchDB 需要提供具有已编译 GWT 客户端代码的 .js 文件。 我在您的案例中看到的主要问题是 couchDB 需要生成您的 PDF 文件,而 couchDB 只是一个存储引擎,通常不进行任何处理。如果你对 Erlang 编程语言有任何了解,我想你可以扩展它。

【讨论】:

我对在 couchdb 上运行 GWT 并不真正感兴趣,我实际上对复制 RPC 调用的功能感兴趣。是否有任何相当于 couchdb 的 Java Servlet 引擎? @TwentyMiles 我试图解释的是您可以调用 CouchDB,但这只是数据访问 (CRUD)。为了能够进行任何处理,您需要有一个 Servlet 引擎,它从 CounchDB 获取数据,然后对其进行处理以生成 PDF。我提出的另一点是,您可以在 CouchDB 前面添加一个 Erlang 模块并调用它来进行处理(当然这不是微不足道的)

以上是关于如何从 couchdb 运行服务器端代码?的主要内容,如果未能解决你的问题,请参考以下文章

CouchDB 是服务器端 Javascript 的一个例子吗?

Node.js 与 CouchDB 和 Backbone.js 一起使用,如何提供 json?

如何避免 CouchDB 和 noSQL 数据库出现类似 SQL 的注入问题?

MongoDB 有本地 REST 接口吗?

从 CouchDB Show Function 发出 AJAX 请求

服务器端 GET