CouchDB отфильтрованная репликация - PullRequest
5 голосов
/ 17 августа 2011

Пробуя фильтры для репликации, я наткнулся на проблему. Пока мой фильтр работает как запись в базе данных _replicator, я не использую cURL.

Фильтр в проектной документации:

{
    "_id": "_design/partial",
    "filters": {
        "mobile": "function(doc, req) { 
            if (doc._attachments) {
                var result = new Boolean(true);
                for (attachment in doc._attachments) {
                    if (attachment.content_type == 'image/jpeg') {
                        return true;
                    }
                    if (doc._attachments.length > 1024) {
                        result = false; 
                    }
                }
                return result;
            } else {
                return true;
            }
        }"
    }
}

Линия cURL:

curl -X POST <a href="http://admin:pass@192.168.178.13:5985/" rel="nofollow">http://admin:pass@192.168.178.13:5985/</a>_replicate -d '{\"source\":\"http://admin:pass@192.168.2:5984/docs2\",\"target\":\"docs2_partial\",\"filter\":\"partial/mobile\",\"create_target\":true}' -H "Content-Type: application/json"

Я создал _design / частичный документ как для цели, так и для источника, но все документы реплицируются. Даже тот, с прикрепленным двоичным файлом больше 1 МБ. Любая помощь приветствуется!

Ответ cURL:

{"ok":true,"session_id":"833ff96d21278a24532d116f57c45f31","source_last_seq":32,"replication_id_version":2,"history":[{"session_id":"833ff96d21278a24532d116f57c45f31","start_time":"Wed, 17 Aug 2011 21:43:46 GMT","end_time":"Wed, 17 Aug 2011 21:44:22 GMT","start_last_seq":0,"end_last_seq":32,"recorded_seq":32,"missing_checked":0,"missing_found":28,"docs_read":28,"docs_written":28,"doc_write_failures":0}]}

Использование «вместо \» или «вместо» приводит к результату:

{"error":"bad_request","reason":"invalid UTF-8 JSON: [...]}

Ответы [ 2 ]

8 голосов
/ 18 августа 2011

Теперь я думаю, что, возможно, логика вашей функции фильтра просто имеет ошибку.Вот как я читаю вашу политику фильтрации:

  • Все документы, которые не имеют вложений, проходят
  • Все документы, которые имеют image/jpeg проход вложений
  • Документы с болеесбой чем 1 024 вложений
  • В любом другом случае документы проходят

Возможно, это неправильная политика.Еще один способ переформулировать эту политику: «Документы с более чем 1024 приложениями не работают, все остальное проходит».Однако, поскольку вы написали так много кода, я подозреваю, что мое резюме не соответствует действительности.

Еще одно краткое замечание о том, что похоже на ошибку.Дано:

for (attachment in doc._attachments) { /* ... */ }

Переменная attachment будет выглядеть как «index.html» или «me.jpeg», то есть имена файлов.Чтобы получить тип содержимого вложения, вам необходимо:

var type;

// This is WRONG
type = attachment.content_type; // type set to undefined

// This is RIGHT
type = doc._attachments[attachment].content_type; // type set to "text/html" etc.

Чтобы избежать этой ошибки, вы можете изменить свой код, чтобы сделать вещи более понятными:

for (attachment_filename in doc._attachments) { /* ... */ }

Далее, doc._attachments.lengthскажет вам количество вложений в документе, а не, например, длину текущего вложения.Странно, что вы проверяете это внутри цикла, потому что выражение никогда не изменится.Вы пытаетесь проверить размер вложения вместо этого?

0 голосов
/ 17 августа 2011

Что выводится из curl (т.е. из CouchDB)?

Исходя из вашего примера, я считаю, что у вас есть ошибка цитирования.Внутри одинарных кавычек вам не нужно избегать двойных кавычек.Попробуйте удалить все эти обратные слеши.Что происходит?

Если вы работаете в Windows, одинарная кавычка недопустима в оболочке.В этом случае сохраните обратную косую черту и просто измените одинарную кавычку на двойную.

...