3.2. JavaScript

注意

虽然每个设计函数都可以访问所有 JavaScript 对象,但下表描述了适当的使用场景。例如,您可以在 emit() 中使用 映射函数,但 getRow() 不允许在 映射函数 中使用。

JS 函数

在设计文档函数中合理使用

emit()

映射函数

getRow()

列表函数

JSON

任何

isArray()

任何

log()

任何

provides()

显示函数列表函数

registerType()

显示函数列表函数

require()

任何,除了 归约和重新归约函数

send()

列表函数

start()

列表函数

sum()

任何

toJSON()

任何

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 ']';
}
JSON

JSON2 对象。

isArray(obj)

一个辅助函数,用于检查提供的值是否为 Array

参数:
  • obj – 任何 JavaScript 值

返回值:

true 如果 objArray 类型,否则为 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.mapviews.lib.reduce 等位置即可。