如何在 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 模板的主要内容,如果未能解决你的问题,请参考以下文章
CouchDB/Sofa:无法使用保存按钮创建新帖子(从默认模板)
CouchDB:使用 Reduce 时如何在 Map 函数中使用数组键?
在 CouchDB/PouchDB-Server 中重写 URL
如何在 couchDB 中添加 cors - 请求的资源上不存在“Access-Control-Allow-Origin”标头