2017-12-12 11 views
0

GET {db}/_design/{ddoc}によって返されたオブジェクトは、PUT要求でサーバーに返されたときにビューを無効にするビューの 'map'値に追加の検証構文を多数挿入します。例えば同期ゲートウェイクエリPUTはGETと互換性がありません

PUT {db}/_design/{ddoc} 
{'views': 
    {'_test': 
    {'map': 
     'function(doc, meta) { if (doc.uid == "test1") { emit(null, null); } }' 
    } 
    } 
} 

が作成:

GET {DB}/_設計/ {DDOC}

{ 
'views': { 
    '_test': { 
     'map': 'function(doc,meta) {\n\t\t 
      var sync = doc._sync;\n\t\t 
      if (sync === undefined || meta.id.substring(0,6) == "_sync:")\n\t\t 
      return;\n\t\t 
      if ((sync.flags & 1) || sync.deleted)\n\t\t 
      return;\n\t\t 
      var channels = [];\n\t\t 
      var channelMap = sync.channels;\n\t\t\t\t\t\t\t 
      if (channelMap) {\n\t\t\t\t\t\t\t\t 
      for (var name in channelMap) {\n\t\t\t\t\t\t\t\t\t 
      removed = channelMap[name];\n\t\t\t\t\t\t\t\t\t 
      if (!removed)\n\t\t\t\t\t\t\t\t\t\t 
      channels.push(name);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t 
      delete doc._sync;\n\t\t 
      meta.rev = sync.rev;\n\t\t 
      meta.channels = channels;\n\n\t\t 
      var _emit = emit;\n\t\t 
      (function(){\n\t\t\t 
      var emit = function(key,value) {\n\t\t\t 
      \t_emit(key,[channels, value]);\n\t\t\t 
      };\n\t\t\t\t\t\t\t\t 
      (function(doc, meta) { if (doc.uid == "test1") { emit(null, null); } }) (doc, meta);\n\t\t\t\t\t\t\t 
      }());\n\t\t\t\t\t\t\t 
      doc._sync = sync;\n\t\t\t\t\t\t}' 
     } 
    } 
} 

}

そして、この新たなオブジェクトが返された場合に後続の設計文書PUT要求では、ビューは有効ではなく、実質的に排除される。

これは、関連する以前のすべてのビューを削除せずにデザインビューアを新しいビューで更新しようとすると、問題が発生します。更新された設計ドキュメントを再提出する前に、すべての(ユーザー定義の)ビュー定義をどこかに格納するか、GETによって返されたオブジェクトを解析してすべての迷惑コードを削除する必要があります。

答えて

0

同期ゲートウェイには、アプリケーションレベルのセキュリティを追加するために、wrapのCouchbase Serverビューが必要です。

常にSync Gatewayを介してビューにアクセスしていますか?例えば、あなたが設計文書を更新しようとしていると言えば、これはSync Gateway経由ですか、あるいはCouchbase Serverを経由していますか?前者が推奨されるアプローチです。

+0

これは意味があります。私の場合は、GETとPUTの両方がSync Gatewayポート経由で呼び出されます。だから、私はあなたの推奨されたアプローチを使用しています...要求が直接CSに行った場合に違いが出ますか? –

+0

私は元の問題を理解していないかもしれませんが、あなたが見ている問題を再現するカールステートメントのシーケンスを投稿できますか?それらが長すぎてSOに直接投稿できない場合は、要点またはペーストビンに入れてもいいですか? – tleyden

関連する問題