查看CouchDB 1.6.1 here的文档,提到您可以使用JS require(path)函数。你怎么做到这一点?文档说path
是" CommonJS模块路径从设计文档root"开始。
我的设计文档名为_design/data
。我上传了一个名为test.js
的设计文档的附件,可以在/_design/data/test.js
访问该附件,并包含以下代码:
exports.stuff = function() {
this.getMsg = (function() {
return 'hi';
})()
}
但是我的map函数中有以下代码:
function(doc) {
try {
var x = require('test.js');
} catch (e) {
emit ('error', e)
}
}
导致此错误:
["error", "invalid_require_path", "Object has no property \"test.js\". {\"views\":{\"lib\":null},\"_module_cache\":{}}"]
看起来require
正在doc
param中寻找路径作为对象......但我不明白为什么会这样。
查看this链接,在较旧版本的CouchDB中描述此功能,它表示您可以:
但是,在即将推出的CouchDB 1.1.x视图中,如果视图位于'视图的下方,则可以查看模块。财产(例如,' views / lib / module')
并提供以下代码示例:
{
"_id": "_design/example",
"lib": {
// modules here would not be accessible from view functions
},
"views": {
"lib" {
// this module is accessible from view functions
"module": "exports.test = 'asdf';"
},
"commonjs": {
"map": function (doc) {
var val = require('views/lib/module').test;
emit(doc._id, val);
}
}
}
}
但这在CouchDB 1.6.1上对我不起作用。我收到错误:
{message: "mod.current is null", fileName: "/usr/share/couchdb/server/main.js", lineNumber: 1137, stack: "([object Array],[object Object])@/usr/share/couchdb/server/main.js:1137\n([object Array],[object Object])@/usr/share/couchdb/server/main.js:1143\n([object Array],[object Object],[object Object])@/usr/share/couchdb/server/main.js:1143\n(\"views/lib/module\")@/usr/share/couchdb/server/main.js:1173\n([object Object])@undefined:3\n([object Object])@/usr/share/couchdb/server/main.js:1394\n()@/usr/share/couchdb/server/main.js:1562\n@/usr/share/couchdb/server/main.js:1573\n"
答案 0 :(得分:1)
在您的问题中,您没有将该函数作为字符串提供。发现它并不容易,但必须先将函数字符串化,然后再将它们存储在CouchDB中(手动或使用.toString()
)。 Caolan在你关联的帖子中有这个错误。
答案 1 :(得分:0)
使用此示例:
15 views: {
16 lib: {
17 foo: "exports.bar = 42;"
18 },
19 test: {
20 map: "function(doc) { emit(doc._id, require('views/lib/foo').bar); }"
21 }
22 }
在旧的CouchDB文档中找到:https://wiki.apache.org/couchdb/CommonJS_Modules
我有一个工作的例子。不确定区别是什么......我正在运行'临时'视图而不是保存,但我不知道为什么会影响require
语句