【问题标题】:Error during couchdb filtered replication with params使用参数过滤复制期间出现错误
【发布时间】:2011-10-17 01:54:04
【问题描述】:

我试图在两台不同的机器上运行过滤复制,我意识到这只发生在拉复制时,如果我做推送复制它工作正常。

curl -X POST http://localhost:5984/_replicate -d '{\"source\":\"http://MARTIN-NEWPC:5984/pdlib\",\"target\":\"pdlib\",\"filter\":\"replication/SINGLE_COLLECTION\",\"query_params\":{\"key\":\"bb579347-9bfb-4dda-84eb-622b43108872\"}}' -H "Content-Type: application/json"

我从该请求中得到的神秘响应是:

{"error":"json_encode", "reason":"{bad_term, <0.20050.0>}"}

并且目标couchdb日志文件中的调试输出为:

[Mon, 17 Oct 2011 01:20:48 GMT] [debug] [<0.476.0>] 'GET' /pdlib/_changes?key=bb579347-9bfb-4dda-84eb-622b43108872&filter=replication/SINGLE_COLLECTION&style=all_docs&heartbeat=10000&since=0&feed=normal {1,
                                                                                                                                                        1}
Headers: [{'Accept',"application/json"},
          {'Content-Length',"0"},
          {'Host',"MARTIN-NEWPC:5984"},
          {'User-Agent',"CouchDB/1.0.2"}]

[Mon, 17 Oct 2011 01:20:48 GMT] [debug] [<0.476.0>] OAuth Params: [{"key","bb579347-9bfb-4dda-84eb-622b43108872"},
               {"filter","replication/SINGLE_COLLECTION"},
               {"style","all_docs"},
               {"heartbeat","10000"},
               {"since","0"},
               {"feed","normal"}]

[Mon, 17 Oct 2011 01:20:48 GMT] [info] [<0.476.0>] 192.168.2.3 - - 'GET' /pdlib/_changes?key=bb579347-9bfb-4dda-84eb-622b43108872&filter=replication/SINGLE_COLLECTION&style=all_docs&heartbeat=10000&since=0&feed=normal 200

[Mon, 17 Oct 2011 01:20:48 GMT] [error] [<0.476.0>] attempted upload of invalid JSON (set log_level to debug to log it)

[Mon, 17 Oct 2011 01:20:48 GMT] [debug] [<0.476.0>] Invalid JSON: <<"bb579347-9bfb-4dda-84eb-622b43108872">>

[Mon, 17 Oct 2011 01:20:48 GMT] [info] [<0.476.0>] 192.168.2.3 - - 'GET' /pdlib/_changes?key=bb579347-9bfb-4dda-84eb-622b43108872&filter=replication/SINGLE_COLLECTION&style=all_docs&heartbeat=10000&since=0&feed=normal 400

[Mon, 17 Oct 2011 01:20:48 GMT] [debug] [<0.476.0>] httpd 400 error response:
 {"error":"bad_request","reason":"invalid UTF-8 JSON"}

如果你需要知道,这是过滤功能:

function (doc, req) {
    if (doc.type == 'collection' || doc.type == 'document') {
        for (var i in doc.path) {
            if (doc.path[i] == req.query.key) {
                return true;
            }
        }
    }
    return false;
}

关于可能的原因有什么想法吗?

【问题讨论】:

    标签: couchdb replication


    【解决方案1】:

    当 CouchDB 尝试将您的查询值之一解释为 JSON 而它是原始(未加引号的)字符串时,通常会收到 400“无效的 UTF-8 JSON”错误。在这种情况下,复制配置会产生这个 HTTP 请求:

    GET /pdlib/_changes?key=bb579347-9bfb-4dda-84eb-622b43108872&filter=replication/SINGLE_COLLECTION&style=all_docs&heartbeat=10000&since=0&feed=normal 400
    

    _changes 提要本身不使用 key 参数,但普通的 CouchDB _view 查询会使用 - 并且期望它是 JSON 值! — 因此您可以尝试将 query_param 重命名为不同的名称。

    (不幸的是,用户定义的过滤器(和列表等)函数与 CouchDB 本身共享查询参数命名空间......您可能希望在自定义参数前加上不太可能与当前或将来的内置选项冲突的东西,例如myapp_key。)

    【讨论】:

    • 嘿,感谢您查看,我正在传递引用的值,否则正如您所说,我收到 JSON 错误(这仅适用于推送复制)。此外,query_param 是我发现将参数传递到复制过滤器中的唯一“记录”参数名称,并且在函数内部您必须使用“req.query”来获取它们,我将如何使用 myapp_key 在过滤器函数中获取我的参数参数?我不得不通过在我的解决方案中使用推送复制来解决这个问题,我非常着急尝试完成它,当我有空闲时间时我会尝试继续挖掘。
    • 我的意思是,用query_params:{prefixed_key:somevalue} 而不是query_params:{key:somevalue} 存储一个复制文档。然后寻找req.query.prefixed_key 而不是req.query.key。这只是一种预感,但我怀疑 CouchDB 将 query.key 视为特殊的。
    【解决方案2】:

    在我看来,您的 JSON 转义方式有问题。这对我有用:

    curl -X POST http://localhost:5984/_replicate -d '{"source":"source_db","target":"target_db","filter":"ddoc/filter-name","query_params":{"key" :"some_key"}}' -H "Content-Type: application/json"

    【讨论】:

      猜你喜欢
      • 2018-07-08
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      相关资源
      最近更新 更多