3.2. JavaScript¶
JS 函数 |
在设计文档函数中合理使用 |
---|---|
任何 |
|
任何 |
|
任何 |
|
任何,除了 归约和重新归约函数 |
|
任何 |
|
任何 |
3.2.1. 设计函数上下文¶
每个设计函数都在预定义对象、模块和函数的特殊上下文中执行
- emit(key, value)¶
在映射函数完成后,为 CouchDB 的进一步处理发出 key-value 对。
- 参数:
key – 视图键
value – 与 key 关联的值
function(doc){ emit(doc._id, doc._rev); }
- getRow()¶
从相关视图结果中提取下一行。
- 返回值:
视图结果行
- 返回类型:
对象
function(head, req){ send('['); row = getRow(); if (row){ send(toJSON(row)); while(row = getRow()){ send(','); send(toJSON(row)); } } return ']'; }
- isArray(obj)¶
一个辅助函数,用于检查提供的值是否为 Array。
- 参数:
obj – 任何 JavaScript 值
- 返回值:
true
如果 obj 是 Array 类型,否则为false
- 返回类型:
布尔值
- log(message)¶
将消息记录到 CouchDB 日志(在 INFO 级别)。
- 参数:
message – 要记录的消息
function(doc){ log('Procesing doc ' + doc['_id']); emit(doc['_id'], null); }
映射函数运行后,可以在 CouchDB 日志中找到以下行(例如,在 /var/log/couchdb/couch.log 中)
[Sat, 03 Nov 2012 17:38:02 GMT] [info] [<0.7543.0>] OS Process #Port<0.3289> Log :: Processing doc 8d300b86622d67953d102165dbe99467
- provides(key, func)¶
为指定的 MIME 键注册可调用处理程序。
- 参数:
key – 由
registerType()
预先定义的 MIME 键func – MIME 类型处理程序
- registerType(key, *mimes)¶
通过关联的 key 注册 MIME 类型列表。
- 参数:
key – MIME 类型
mimes – MIME 类型枚举
预定义映射 (key-array)
all:
*/*
text:
text/plain; charset=utf-8
,txt
html:
text/html; charset=utf-8
xhtml:
application/xhtml+xml
,xhtml
xml:
application/xml
,text/xml
,application/x-xml
js:
text/javascript
,application/javascript
,application/x-javascript
css:
text/css
ics:
text/calendar
csv:
text/csv
rss:
application/rss+xml
atom:
application/atom+xml
yaml:
application/x-yaml
,text/yaml
multipart_form:
multipart/form-data
url_encoded_form:
application/x-www-form-urlencoded
json:
application/json
,text/x-json
- require(path)¶
通过指定的 path 加载 CommonJS 模块。路径不应以斜杠开头。
- 参数:
path – 从设计文档根目录开始的 CommonJS 模块路径
- 返回值:
导出语句
- send(chunk)¶
以响应形式发送单个字符串 chunk。
- 参数:
chunk – 文本块
function(head, req){ send('Hello,'); send(' '); send('Couch'); return ; }
- start(init_resp)¶
启动分块响应。可以选择在此时发送自定义的 响应 对象。仅适用于 list 函数!
注意
列表函数可以通过调用此函数来设置 HTTP 响应代码 和 标头。此函数必须在
send()
、getRow()
或 return 语句之前调用;否则,查询服务器将隐式地使用空对象 ({}
) 调用此函数。function(head, req){ start({ "code": 302, "headers": { "Location": "https://couchdb.apache.org" } }); return "Relax!"; }
- sum(arr)¶
对 arr 的项目求和。
- 参数:
arr – 数字数组
- 返回类型:
数字
- toJSON(obj)¶
将 obj 编码为 JSON 字符串。这是
JSON.stringify
方法的别名。- 参数:
obj – 可 JSON 编码的对象
- 返回值:
JSON 字符串
3.2.2. CommonJS 模块¶
对 CommonJS 模块 的支持(在 CouchDB 0.11.0 中引入)允许您创建模块化设计函数,而无需重复功能。
这是一个检查用户权限的 CommonJS 模块
function user_context(userctx, secobj) {
var is_admin = function() {
return userctx.indexOf('_admin') != -1;
}
return {'is_admin': is_admin}
}
exports['user'] = user_context
每个模块都可以访问其他全局变量
module (object): 包含有关存储模块的信息
id (string): 模块 ID;ddoc 上下文中的 JSON 路径
current (code): 编译后的模块代码对象
parent (object): 父框架
exports (object): 导出语句
exports (object): 到
module.exports
对象的快捷方式
CommonJS 模块可以添加到设计文档中,如下所示
{
"views": {
"lib": {
"security": "function user_context(userctx, secobj) { ... }"
}
},
"validate_doc_update": "function(newdoc, olddoc, userctx, secobj) {
user = require('views/lib/security').user_context(userctx, secobj);
return user.is_admin();
}"
"_id": "_design/test"
}
模块路径相对于设计文档的 views
对象,但模块只能从通过 lib
引用的对象中加载。 lib
结构仍然可以用于视图函数,只需将视图函数存储在例如 views.lib.map
、views.lib.reduce
等位置即可。