【问题标题】:How do you use require() within a map function?如何在 map 函数中使用 require()?
【发布时间】:2017-03-26 20:40:03
【问题描述】:

查看 CouchDB 1.6.1 here 的文档,提到您可以使用 JS 的 require(path) 函数。你怎么做到这一点?文档说 path 是“从设计文档根目录开始的 CommonJS 模块路径”。

我的设计文档名为_design/data。我已经上传了一个名为test.js 的设计文档的附件,可以通过/_design/data/test.js 访问,其中包含以下代码:

exports.stuff = function() {
    this.getMsg = (function() {
        return 'hi';
    })()
}

但我的地图函数中的以下代码:

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 正在寻找路径作为docparam 中的对象...但我不明白为什么会这样。

查看this 链接,在旧版本的 CouchDB 中描述此功能,它说您可以:

但是,在即将推出的 CouchDB 1.1.x 中,只要模块存在于“views”属性(例如,“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"

【问题讨论】:

    标签: javascript view couchdb require


    【解决方案1】:

    在您的问题中,您没有将函数作为字符串提供。这不太容易发现,但您必须在将函数存储到 CouchDB 之前将它们字符串化(手动或使用 .toString())。 Caolan 在您链接的帖子中存在该错误。

    【讨论】:

    • 谢谢。你的意思是在 test.js 中?
    • 不,在你的问题中。应该是这样(无法在 cmets 中更好地格式化):"commonjs": { "map": "function (doc) { var val = require('views/lib/module').test; emit(doc._id, val); }"}
    【解决方案2】:

    使用这个例子:

      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 声明

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 2017-06-04
      • 2019-06-16
      • 2021-12-30
      • 1970-01-01
      相关资源
      最近更新 更多