在couchdb中,可以在Javascript中定义map和reduce函数,并通过HTTP POST将它们提交给服务器来定义视图。凉。
Apps指定相应功能的字符串表示。
我正在构建一个连接到couchdb的JS应用程序,使用emacs,一个文本编辑器。这让我可以像这样定义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之前,是否有一种典型或推荐的方式来清理他们的javascript函数?
答案 0 :(得分:1)
不,没什么特别的。它们由常规JavaScript引擎(SpiderMonkey)解释/编译,不需要任何预处理或清理等等。像任何其他脚本一样编写它们。
网络上使用的大多数练习具有完全相同的含义或效果 - 如果您以某种方式设法向数据库发送数千种不同的功能并希望节省带宽,则可以缩小发送的所有内容。你可以将其他语言的代码编译成JS等等。
答案 1 :(得分:0)
没有
我们不仅不清理它们,我们将它们放在设计文件中的cofeescript中,该文件由cake
任务插入,该任务将它们自动转换为JS。
答案 2 :(得分: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);}}"},...}}