代码之家  ›  专栏  ›  技术社区  ›  TwentyMiles

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

  •  2
  • TwentyMiles  · 技术社区  · 14 年前

    CouchDB擅长存储和服务数据,但我在处理如何使用它进行后端处理方面遇到了一些困难。例如,GWT具有同步和异步回调的框外支持,这允许您在服务器上运行任意Java代码。有没有办法用CouchDB做这种事情?

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

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

    有没有一种方法可以通过现成的couchdb来实现这一点,或者需要一些额外的第三方软件来在Web客户端和后端数据处理代码之间进行通信?

    编辑:看来我在解释我的问题上做得很差。我感兴趣的是从CouCHDB中服务servlet,类似于您可以通过WAR文件在Web页面上服务Java servlet的方式。我以GWT为例,因为它支持一起开发servlet和客户端代码,并将所有内容编译成单个war文件。我会非常感兴趣这样的事情,因为它可以使部署全功能的网站通过couchdb复制变得轻而易举。

    但是,从外观上看,我的问题的答案是不,您不能从couchdb服务servlet。数据库是为CRUD风格的交互而建立的,任何servlet风格的组件都需要单独提供服务,或者通过轮询数据库来进行更改并相应地执行操作来完成。

    2 回复  |  直到 14 年前
        1
  •  3
  •   BenD    14 年前

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

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

    当然,魔鬼在细节上…

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

    • 使用 _changes API 监控以“1”开头的新文档-
    • 对仅返回没有“_attachments”属性的文档的CouchDB视图发出请求。如果没有要处理的文档,则不会返回任何内容。
      • 可选:如果您有多个并行处理队列的PDF生成过程,您将希望使用如下属性更新coach文档 {"being-processed":true} 并过滤掉这些视图。

    其他一些想法:

    • 我不建议在这个用例中使用couchdb externals API,因为它(基本上)意味着couchdb和您的PDF生成代码必须在同一台机器上。但这是值得注意的。
    • 我对GWT一点都不了解,但似乎没有必要实现你的目标。当然,couchdb可以服务于任何您想要的静态文件(JS或其他),无论是作为数据库中文档的附件,还是来自文件系统的附件。甚至可以将eval()json属性放入coach文档中。因此,您可以使用GWT进行Ajax调用或其他任何调用,但GWT可以完全与CouchDB分离。这样可能更简单。
        2
  •  1
  •   Romain Hippeau    14 年前

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

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