Ошибка во время репликации фильтрованного couchdb с параметрами - PullRequest
1 голос
/ 17 октября 2011

Я пытаюсь запустить отфильтрованную репликацию на двух разных машинах, я понял, что это происходит только при выполнении репликации по запросу, если я выполняю принудительную репликацию, она работает нормально.

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;
}

Есть идеи о возможной причине?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2011

Похоже, что что-то не так с тем, как вы сбежали из своего 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 "

0 голосов
/ 16 ноября 2011

Обычно возникает ошибка 400 «недопустимый код UTF-8 JSON», когда CouchDB пытается интерпретировать одно из значений вашего запроса как 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, но обычные запросы _view CouchDB используют - и ожидается, что это будет значение JSON! - так что вы можете попробовать переименовать этот query_param во что-то другое.

(К сожалению, определенные пользователем функции фильтрации (и список, и т. Д.) Совместно используют пространство имен параметров запроса с самой CouchDB ... вы можете захотеть добавить к вашим пользовательским параметрам префикс с чем-то, что вряд ли будет конфликтовать с текущими или будущими встроенными параметрами Например, myapp_key.)

...