如何在 CouchDB 中使用 html 模板

Posted

技术标签:

【中文标题】如何在 CouchDB 中使用 html 模板【英文标题】:how to use html templates in CouchDB 【发布时间】:2012-04-06 05:43:44 【问题描述】:

我一直在到处寻找,试图弄清楚这一点。我正在尝试从 couchdb 显示和列表函数生成 html 页面。我想利用 underscore.js 的模板解决方案。我遇到的问题是如何在我的 show 和 list 函数中包含 html 模板。

我在哪里存放它们?作为附件?然后我如何在我的 show 和 list 函数中引用它们。我假设 !json 和 !code 宏没有被使用,我不知道如何使用普通 js 中的 require() 来做到这一点。

任何帮助都会动摇!

谢谢!

额外信息:我使用 Kanso 来推送我的应用,而不是 CouchApp。

【问题讨论】:

【参考方案1】:

根据定义,CouchDB 附件是not accessible in show and list functions。

显示和列表函数支持 CommonJS。因此,您只需在设计文档中包含任何库即可。

 "_id": "_design/example"
, "say_hi": "module.exports = function(person)  return 'Hello, ' + person "
, "shows":
   "hello": "function(doc, req)  var hi = require('say_hi'); return hi(req.query.me) "
  

这个视图看起来像这样

GET /my_db/_design/example/_show/hello?me=Jason

HTTP/1.1 200 OK
Server: CouchDB/1.2.0 (Erlang OTP/R15B)
Date: Fri, 06 Apr 2012 11:02:33 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 12


Hello, Jason

【讨论】:

感谢您的快速回复!太好了,我已经做到了这一点,但是有没有办法包含 html 模板(或 css)?从长远来看,将我的模板创建为 javascript 字符串确实很难维护。 是的,在map函数中,this是对设计文档的引用。如果设计文档中有"hello":"Hello, user",那么在map函数里面,可以引用this.hello,得到字符串"Hello, user" 非常感谢杰森!这很棒!嘿,我一直在学习如何使用 CouchDB,有什么方法可以帮忙吗?教别人?向社区添加沙发应用程序?等等…… 不客气。我实际上更喜欢@Slartibartfast 的答案,因为它有事情运作的历史:) @Costa 我强烈建议您通过电子邮件向 CouchDB 用户列表发送相关问题。如果你想积累沙发应用程序的经验,我希望社区拥有 百万 个应用程序,其他人也有想法!【参考方案2】:

我对 Kanso 不熟悉,但在 CouchDB 1.1 之前,CouchDB 中的查看/显示等功能无法包含任何内容。 (CouchApp 工具有自己的!include 解决方法来解决这个问题。)这些不再是必需的。 CouchDB 1.1 添加了 CommonJS 支持。

模板和库必须是设计文档的一部分。您可以通过引用this.some_key 来访问原始值(作为字符串);或者通过执行require("some_key") 来通过 CommonJS 加载它们。

例如:

exports.example_view = 
    map: function (doc) 
        // this must be placed *inside* the map function
        var example = require('views/lib/example');
        if (doc.num) 
            emit(doc._id, example.fn());
        
    
;

(Sharing code between views)

要在服务器端呈现模板,您需要将它们编码为字符串并像需要其他 JavaScript 库一样需要它们。 (对于浏览器端渲染,可以通过 AJAX 获取附件。)

【讨论】:

谢谢!将我的模板编码为字符串正是我想要避免的。接下来我将寻找某种预处理器。 查看/显示可以包括任何东西,使用CommonJS。在您的示例中, Kanso(虽然出色)是无关紧要的。 map 函数中的require() 出现在 CouchDB 中。 @JasonSmith 这很有趣。这是最近的变化吗?为什么 CoichApp 有包含宏的宏? @Slartibartfast 它到达了 CouchDB 1.1。旧的 CouchApp 功能是一种解决方法。我冒昧地更新了您的答案,以讲述漫长的肮脏传奇:) 谢谢,伙计们,这很清楚了!到目前为止,我能够使用 require 包含下划线,使用 this.templates 或 require 包含 html 模板,并使用 _.template 编译模板以使用列表函数显示我的内容。我的下一个目标是看看我是否可以创建一个完整的动态 html 页面(css、js、imgs、字体和所有),并通过 couchdb 列表函数通过一个 GET 请求使其可用。 3 或 4 个请求我完全没问题,但这将是一个有趣的挑战。

以上是关于如何在 CouchDB 中使用 html 模板的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 在 Couchdb 中显示所有文档

CouchDB/Sofa:无法使用保存按钮创建新帖子(从默认模板)

CouchDB:使用 Reduce 时如何在 Map 函数中使用数组键?

在 CouchDB/PouchDB-Server 中重写 URL

如何在 couchDB 中添加 cors - 请求的资源上不存在“Access-Control-Allow-Origin”标头

如何使用 javascript 在 couchdb 中使用多个组合键进行查询,而无需为每个组合编写单独的视图?