1

在couchdb 中,可以在Javascript 中定义map 和reduce 函数,并通过HTTP POST 将它们提交到服务器以定义视图。凉爽的。

应用程序指定相应函数的字符串表示。

我正在使用文本编辑器 emacs 构建一个连接到 couchdb 的 JS 应用程序。这让我可以像这样定义 map 和 reduce 函数:

var byname = function(doc) { 
   emit(doc.name,null);
};

这给了我 emacs 语法高亮、jslint 检查等等。

在运行时,我可以得到这样定义的一组视图函数中的每一个的字符串表示,并将其发送到 CouchDB,方法是:

doc = { views: { empty:   { map:stringRep(empty) },
                 byname:  { map:stringRep(byname) },
                 invalid: { map:stringRep(invalid) }}};

// PUT that doc to couchdb here, to define the design_doc . 

但字符串表示包括换行符、回车符等。

我可以用正则表达式替换过滤掉那些,这适用于简单的情况。但函数中还有更复杂的注释行情况。例如:

var byname = function(doc) { 
   // a comment here
   emit(doc.name,null);
};

在这种情况下,stringRep 将包含注释,但如果我消除了换行符和虚拟空格,注释仍然存在。我也可以更换这些,但可能还有其他问题(不确定)。

人们是否有一种典型或推荐的方式来清理他们的 javascript 函数,然后再将它们发送到 couchdb?

4

3 回答 3

1

不,没有什么特别的。它们由常规 JavaScript 引擎 (SpiderMonkey) 解释/编译,不需要任何预处理或清理等。像编写任何其他脚本一样编写它们。

Web 上使用的大多数做法具有完全相同的含义或效果 - 如果您设法以某种方式将数千个不同的功能发送到 DB 并希望节省带宽,您可以缩小发送的所有内容;您可以将其他语言的代码编译为 JS 等。

于 2012-06-29T08:21:26.590 回答
0

这就是我最终使用的:

CouchDB.stringRep = function(fn) {
    return fn.toString()
        .replace(/[\s\t]*\/\/.*$/gm, '') // comments
        .replace(/\n */gm, ' ')
        .replace(/\r */gm, ' ')
        .replace(/\{ +/gm, '{')
        .replace(/ +\}/gm, '}');
};

然后我用这种 HTTP 消息上传以这种方式序列化的函数:

PUT https://foo.cloudant.com/fop/_design/baseViews HTTP/1.1
Accept: text/plain,application/json
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)
Content-Length: ...
Host: foo.cloudant.com

{"views":{"empty":{"map":"function(doc) {if ( ! doc.observation || doc.observation === '') {emit(doc.id, 1);}}"},...}} 
于 2012-06-29T07:59:35.767 回答
0

不。

我们不仅不清理它们,而且将它们放在 cofeescript 中的设计文件中,该文件由cake自动将它们转换为 JS 的任务插入。

于 2012-06-28T19:56:39.643 回答