我想在PouchDB和map函数中创建一个设计文档,以便使用lodash
和moment
。理想情况下,我希望通过以下假设示例获得类似的结果;
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()
范围无效。有没有办法注入这些库?
答案 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)
似乎答案很简单,当您使用网络工作时,将lodash
和moment
公开给window
或self
。然后当pouchDB eval
成为函数时,引用就会被解析。