是否可以在 PouchDB 地图功能中使用 lodash?

Is it possible to use lodash in PouchDB map function?

我想在 PouchDB 和地图函数中创建一个设计文档以利用 lodashmoment。理想情况下,我想通过以下假设示例获得类似的结果;

import {get} from 'lodash';
import moment from 'moment';

const mapFn = (doc, emit) => {
  emit([
     get(doc, 'context.location'),
     moment(get(doc, 'context.start')).format('DD-MMM-YYYY')
  ], get(doc, 'payments.total'));

};

db.put({
  _id: `_design/myIndex`,
    views: {
      myIndex: {
        map: mapFn.toString()
    }
  }
})

由于toString(),范围无效。有没有办法注入这些库?

似乎答案很简单,当您使用网络工作者时,将 lodashmoment 公开给 windowself。然后当 pouchDB evals 函数时,引用被解析。

您提出的解决方案可能有效,但不是最干净的解决方案(它依赖于全局变量并且仅在您的应用程序存在时有效,但如果您尝试复制数据并在其他地方使用视图,它就会中断) .

有一个更好的解决方案也适用于复制,例如使用 CouchDB:在您的视图中使用 CommonJS require()See the CouchDB docs for more info. There is also an example for using CommonJS 在文档中。

只需使用 views.lib.lodash = lodash.toString(); 对其进行字符串化,然后您就可以在视图函数中将其用作 require:

mapFn = (doc, emit) => {
  var _ = require('views/lib/lodash');
  var moment = require('views/lib/moment');

  emit([
     _.get(doc, 'context.location'),
     moment(_.get(doc, 'context.start')).format('DD-MMM-YYYY')
  ], _.get(doc, 'payments.total'));
};

请注意,无论何时更新 lodash,您的视图都会失效(理论上,新的 lodash 版本可能会产生不同的视图结果)。你也不能只从 lodash 中对 get 进行字符串化,因为你会失去上下文。你可以 npm install lodash.get 并使用它,这应该是独立的。并始终使用浏览器的独立版本,因为库中的 require()s 由于路径不同而无法工作。

但在你的情况下,我宁愿使用一个简单的辅助函数而不是需要一个更大的库,这是一个太多的权衡。