你如何在map函数中使用require()?

时间:2017-03-26 20:40:03

标签: javascript view couchdb require

查看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"

2 个答案:

答案 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语句