我正在使用pouchdb作为库为tiddlywiki写一个小同步适配器。我已经成功地尝试了关于相同想法的couchdb,我虽然pouchdb应该非常相似,但更好。
除了主要设计文档的一个特定视图外,一切正常。我刚刚复制了我在couchdb使用的视图,它工作得很好,但是我收到了一个愚蠢的错误:字段没有定义。这显然是明确的!这是我的观看代码:
function (doc) {
fields = {};
for(var field in doc.fields ){
//text should not be included, neither title. We also avoid to send too long fields
if( ['text','title'].indexOf(field) === -1 && doc.fields[field].length < 1024){
fields[field] = doc.fields[field];
}
}
fields.revision = doc._rev; //required for proper sync
emit(doc._id,fields);
}
正如您所看到的,我要做的第一件事就是定义字段。我尝试添加var fields
,结果是一样的。这真让我抓狂。如果我希望这个工作,我必须加入同一行的所有内容。我的目标是将此函数外部化为文本文档,以便能够轻松编辑它,所以我可以这样做:
var My_view=DoWatheverToGetTheText();
var design_document = {
'_id': '_design/tw',
'views': {
'skinny-tiddlers': {
'map': My_view
}}
};
我试过,我得到了完全相同的错误。我不希望将其硬编码到我的应用程序中,我希望它是模块化的。我做错了什么?
答案 0 :(得分:0)
最后我自己找到了解决方案。
我这样做的方法首先是将设计文档分成两个文件。一个只有设计文档定义,没有map函数但在其位置上有一个空属性。确保此文档是有效的JSON非常重要,这是我的一个问题。
{"_id": "_design/TiddlyPouch",
"views": {
"someView": {
"map": ""
}},
"filters": {
"tiddlers" : ""
}
}
然后我将map函数(只是没有名称的函数)写入另一个文件。它看起来像这样:
function(doc){
var fields = {};
for(var field in doc.fields ){
if( ['text','title'].indexOf(field) === -1){
fields[field] = doc.fields[field];
}
}
fields.revision = doc._rev;
emit(doc._id,fields);
}
为了使它们适合,我首先评估设计文档以获得设计对象。然后,我将该函数作为纯文本提取,并且我加入了它,没有任何回车。基本上我把它做成一行。然后你要做的就是把那个纯文本的函数作为map属性的值:
stringContainingFunction = functiontext.replace(/\r?\n/,' ');
designDocument.views.someView.map = stringContainingFunction;
之后,我只是将对象推送到pouchdb,它运行良好。
答案 1 :(得分:0)
正如您所看到的,我正在做的第一件事是定义字段。
猜测:您缺少fields = {};
的var关键字。在strict mode中运行javascript时,这会导致引用错误。