Pouchdb设计视图未正确评估

时间:2015-05-26 22:09:06

标签: pouchdb

我正在使用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
    }}
  };

我试过,我得到了完全相同的错误。我不希望将其硬编码到我的应用程序中,我希望它是模块化的。我做错了什么?

2 个答案:

答案 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时,这会导致引用错误。