2011-08-17 12 views
5

Provando i filtri per la replica, mi sono imbattuto in un problema. Mentre il mio filtro funziona come una voce nel database _replicator, non lo faccio quando uso cURL.CouchDB Filtered Replication

Il filtro nel documento di progetto è:

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

La linea cURL:

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"

ho creato _design/documento parziale su entrambi origine e destinazione, ma tutti i documenti vengono replicati . Anche quello con un binario allegato più grande di 1 MB. Qualsiasi aiuto è apprezzato!

La risposta 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}]} 

Utilizzando uno "invece di \" o "invece di 'il risultato è:

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

risposta

8

Ora penso che forse la logica della funzione filtro ha semplicemente un bug. Ecco come ho letto la vostra politica di filtro:

  • tutti i documenti che non hanno gli allegati passano
  • tutti i documenti che hanno un image/jpeg attacco passano
  • Documenti con più di 1.024 gli allegati fallire
  • In ogni altro caso , i documenti passano

Sembra una politica errata. Un altro modo per ridefinire questo criterio è "I documenti con più di 1024 allegati falliscono, tutto il resto passa". Tuttavia, dal momento che hai scritto così tanto codice, sospetto che il mio sommario non sia la vera politica.

Un'altra breve nota, su quello che sembra un insetto. Dato:

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

La variabile attachment sarà cose come "index.html" o "me.jpeg", vale a dire i nomi dei file. Per ottenere il contenuto-tipo di allegato, è necessario:

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. 

Per evitare questo errore, è possibile modificare il codice per rendere le cose più chiare:

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

Avanti, doc._attachments.length vi dirà il numero di allegati nel documento, non per esempio la lunghezza dell'attuale allegato. È strano che tu lo verifichi all'interno del ciclo, perché l'espressione non cambierà mai.Stai provando a testare la dimensione degli allegati ?

+0

Grazie! Cambiarlo in 'doc._attachments [attachment] .content_type' e' doc._attachments [attachment] .length' ha funzionato. Però c'è molto di più nella logica, come il permettere l'uso di jpeg di qualsiasi lunghezza e ulteriori criteri che non ho incollato. – degeeman

0

Qual è l'uscita dal ricciolo (cioè da CouchDB) ?

Dal tuo esempio, la mia prima ipotesi è che tu abbia un errore di quotatura. All'interno di virgolette singole, non è necessario sfuggire alle virgolette. Prova a rimuovere tutti quei backslash. Cosa succede?

Se si utilizza Windows, la quota singola non è valida nella shell. In tal caso, mantieni i backslash e modifica semplicemente la quota singola in virgolette.

+0

Grazie per la risposta, ho aggiunto le informazioni al post originale. – degeeman

+0

btw. Sono su Windows, ho provato sia cmd che PowerShell – degeeman

+0

Ok, la prima risposta significa che non c'è alcun errore di sintassi. Non mi ero reso conto che la citazione singola fosse valida in Windows. Faccio sempre una virgola e poi sfugco a tutte le mie virgolette. Comunque, passando a nuove idee. – JasonSmith