2011-08-17 11 views
5

Próbowałem filtrów do replikacji, natknąłem się na problem. Podczas gdy mój filtr działa jako wpis w bazie _replicator, nie jest używany podczas korzystania z cURL.CouchDB Filtrowana replikacja

Filtr w dokumencie projektu jest:

{ 
    "_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; 
      } 
     }" 
    } 
} 

zwijającego linia:

curl -X POST http://admin:[email protected]:5985/ _replicate -d '{\"source\":\"http://admin:[email protected]:5984/docs2\",\"target\":\"docs2_partial\",\"filter\":\"partial/mobile\",\"create_target\":true}' -H "Content-Type: application/json"

stworzyłem _design/dokument częściowe zarówno cel i źródła, ale wszystkie dokumenty są replikowane . Nawet ten z dołączonym plikiem binarnym większym niż 1 MB. Każda pomoc jest doceniana!

zwijającego odpowiedź brzmi:

{"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}]} 

Korzystanie albo "zamiast \" lub "zamiast" wynik to:

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

Odpowiedz

8

Teraz myślę, że być może logika funkcji filtra po prostu ma błąd. Oto jak czytam swoją politykę filtr:

  • Wszystkie Dokumenty, które nie mają załączniki przechodzą
  • Wszystkie dokumenty, które mają image/jpeg przywiązanie przechodzą
  • Dokumenty z ponad 1024 załączników fail
  • W każdym innym przypadku Dokumenty przekazują

To brzmi jak być może niepoprawna polityka. Innym sposobem na ponowne sformułowanie tej zasady jest "Dokumenty zawierające ponad 1024 załączniki zawodzą, wszystko inne przechodzi." Jednak odkąd napisałeś tak dużo kodu, podejrzewam, że moje podsumowanie nie jest prawdziwą polityką.

Kolejna szybka notatka, na czym wygląda bug. Biorąc pod uwagę:

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

Zmienna attachment będą takie rzeczy jak "index.html" lub "me.jpeg", czyli nazwy plików. Aby uzyskać typ zawartości załączników, trzeba:

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. 

Aby uniknąć tego błędu, można zmienić swój kod, aby uczynić to bardziej jasne:

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

Dalej, doc._attachments.length powie liczby załączniki w dokumencie, a nie na przykład długość bieżącego załącznika. To dziwne, że testujesz to w pętli, ponieważ wyrażenie nigdy się nie zmieni.Czy próbujesz przetestować rozmiar załącznika ?

+0

Dziękujemy! Zmiana tego na 'doc._attachments [attachment] .content_type' oraz' doc._attachments [attachment] .length' zmyśliło. Ale fyi jest coś więcej w logice, jak zezwolenie na jpeg o dowolnej długości i inne kryteria, których nie wkleiłem. – degeeman

0

Czym jest wyjście z dyni (tj z CouchDB) ?

Z twojego przykładu, domyślam się, że masz błąd w cudzysłowach.Wewnątrz pojedynczych cudzysłowów nie musisz uciekać od podwójnych cudzysłowów. Spróbuj usunąć te wszystkie ukośniki odwrotne Co się stanie?

Jeśli jesteś w systemie Windows, pojedynczy cytat nie jest poprawny w powłoce. W takim przypadku trzymaj odwrócone ukośniki i po prostu zmień pojedynczy cytat na podwójny cudzysłów.

+0

Dziękuję za odpowiedź, dodałem informacje do oryginalnego wpisu. – degeeman

+0

btw. Jestem na Windowsie, wypróbowałem zarówno cmd jak i PowerShell – degeeman

+0

Dobra, pierwsza odpowiedź oznacza, że ​​nie ma błędu składni. Nie zdawałem sobie sprawy, że pojedynczy cytat jest ważny w systemie Windows. Zawsze robię podwójny cytat, a potem uciekam od wszystkich moich podwójnych cudzysłowów. W każdym razie, przechodząc do nowych pomysłów. – JasonSmith