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

时间:2017-03-10 14:01:43

标签: mapreduce lodash pouchdb

我想在PouchDB和map函数中创建一个设计文档,以便使用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()范围无效。有没有办法注入这些库?

2 个答案:

答案 0 :(得分:2)

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

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

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

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将无效。

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

答案 1 :(得分:0)

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