CouchDB中Show与List函数的使用与特性
立即解锁
发布时间: 2025-08-20 02:20:04 阅读量: 1 订阅数: 2 


CouchDB权威指南:从入门到实践
# CouchDB 中 Show 与 List 函数的使用与特性
## 1. Show 函数相关特性
### 1.1 URL 参数与缓存
在使用 Show 函数时,URL 参数的使用有其独特之处。例如请求 `GET /mydb/_design/mydesign/_show/myshow?parrot=Captain` 会输出 `<p>Aye aye, Captain!</p>`。允许 URL 参数进入函数不会影响缓存能力,因为每次唯一的调用都会产生一个不同的 URL。然而,过度使用此功能会降低缓存效果。这类查询参数对于切换显示函数输出的模式或格式非常有用,但不建议用于在响应中插入自定义内容(如请求用户昵称),因为这意味着每个用户的数据都必须单独缓存。
### 1.2 Accept 头信息
HTTP 规范的一部分允许客户端向服务器提示其能够接受的媒体类型。CouchDB 0.10.0 附带的 JavaScript 查询服务器包含处理 Accept 头信息的辅助工具。但 Web 浏览器对 Accept 头信息的支持很差,这导致像 Ruby on Rails 这样的框架取消了对它们的支持。CouchDB 可能会也可能不会效仿,但不建议依赖 Accept 头信息来开发通过 Web 浏览器访问的应用程序。
以下是一个示例:
```plaintext
GET /db/_design/app/_show/post
Accept: application/xml
```
这等同于一个具有不匹配 Accept 头信息的类似 URL 请求。因为浏览器在处理提要 URL 时不会使用合理的 Accept 头信息。
请求函数允许开发人员根据客户端的请求切换响应的 Content - Type。CouchDB 的 `main.js` 库提供了 `("format", render_function)` 函数,使开发人员能够在一个表单函数中处理客户端对多种 MIME 类型的请求。该函数还展示了 `registerType(name, mime_types)` 的使用,它将新类型添加到 `respondWith` 使用的映射对象中。
### 1.3 Etag 机制
Show 函数请求是无副作用且可缓存的,而 Etag 是实现这一特性的标准 HTTP 机制。当客户端首次请求资源时,响应会附带一个 Etag,它是一个与所请求资源版本唯一对应的不透明字符串令牌。当客户端再次请求同一资源时,会随请求发送原始 Etag。如果服务器确定 Etag 仍与资源匹配,就可以避免发送完整响应,而是回复“你已经拥有最新版本”。正确使用 Etag 可以显著减少服务器负载,CouchDB 提供了 Etag 头信息,通过使用像 Squid 这样的 HTTP 代理缓存,可以立即减轻 CouchDB 的负载。
### 1.4 函数与模板
CouchDB 的进程运行器只关注存储在 `show` 下的函数,但我们希望将模板 HTML 与内容协商逻辑分开。`couchapp` 脚本使用 `!code` 和 `!json` 处理程序来帮助我们实现这一点。
以下是 Sofa 的编辑显示函数示例:
```javascript
function(doc, req) {
// !json templates.edit
// !json blog
// !code vendor/couchapp/path.js
// !code vendor/couchapp/template.js
// we only show html
return template(templates.edit, {
doc : doc,
docid : toJSON((doc && doc._id) || null),
blog : blog,
assets : assetPath(),
index : listPath('index','recent-posts',{descending:true,limit:8})
});
}
```
这个函数的前四行注释在 JavaScript 中看似普通注释,但实际上是特殊文档。CouchApp 上传脚本知道如何读取显示函数顶部的这些特殊注释,它们包含宏,宏以感叹号 `!` 开头并后跟一个名称。目前,CouchApp 支持 `!json` 和 `!code` 两个宏。
#### 1.4.1 `!json` 宏
`!json` 宏接受一个参数,即 CouchApp 目录层次结构中文件的点表示法路径。它会读取文件内容并将其放入一个与文件路径点表示法同名的变量中。例如:
```javascript
// !json template.edit
```
CouchDB 会读取文件 `template/edit.*` 并将其内容放入变量:
```javascript
var template.edit = "contents of edit.*"
```
指定路径时可省略文件扩展名,这样可以读取 `.json`、`.js`、`.html` 或其他文件到函数变量中。但由于该宏会匹配任何扩展名的文件,所以不能有两个同名但扩展名不同的文件。此外,还可以指定一个目录,CouchApp 会加载该目录及其所有子目录中的所有文件。
#### 1.4.2 `!code` 宏
`!code` 宏与 `!json` 宏类似,但用途略有不同。它不是将一个或多个文件的内容作为变量提供给函数,而是用宏参数中引用的文件内容替换自身。这对于在 CouchDB 函数(如 map、reduce、show、list、validate)之间共享库函数非常有用,无需在多个地方维护源代码。例如:
```javascript
// !code vendor/couchapp/path.js
```
CouchApp 会将这一行替换为 `path.js` 的内容,使这些函数在显示函数中本地可用。不过,`!code` 宏一次只能加载一个文件。
### 1.5 学习 Show 函数
Show 函数是一个将文档和 HTTP 请求的一些细节转换为 HTTP 响应的 JavaScript 函数。通常用于构建 HTML,但也能够返回 Atom 提要、图像甚至过滤后的 JSON。在开发 Show 函数时,使用模板可以避免大量字符串操作带来的困扰。大多数编程环境通过模板解决这个问题,即看起来像 HTML 但部分内容可以动态填充的文档。
虽然在
0
0
复制全文
相关推荐










