2011-08-17 20 views
5

Al probar los filtros para la replicación, me encontré con un problema. Si bien mi filtro funciona como una entrada en la base de datos _replicator, no lo hago cuando uso cURL.Replicación filtrada de CouchDB

El filtro en el documento de diseño es:

{ 
    "_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 línea 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"

creé _Diseño documento/parcial en tanto objetivo y la fuente, pero todos los documentos se replican . Incluso el que tiene un binario adjunto de más de 1 MB. ¡Se agradece cualquier ayuda!

La respuesta cURL es:

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

Utilizando cualquiera "en lugar de \" o "en lugar de" el resultado es:

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

Respuesta

8

Ahora creo que quizás la lógica de su función de filtro simplemente tiene un error. Aquí es cómo leer su política de filtro:

  • Todos los documentos que no tienen archivos adjuntos pasan
  • Todos los documentos que tienen un archivo adjunto image/jpeg pasan
  • Docs con más de 1.024 archivos adjuntos fallar
  • En cualquier otro caso , los documentos pasan

Parece una política incorrecta. Otra forma de replantear esta política es "Los documentos con más de 1024 archivos adjuntos fallan, todo lo demás pasa". Sin embargo, dado que escribió tanto código, sospecho que mi resumen no es la verdadera política.

Otra nota rápida, en lo que parece un error. Teniendo en cuenta:

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

La variable será attachment cosas como "index.html" o "me.jpeg", es decir, los nombres de archivo. Para obtener el contenido de tipo de conexión, necesita:

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. 

Para evitar este error, puede cambiar su código para hacer las cosas más claras:

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

A continuación, doc._attachments.length le dirá el número de archivos adjuntos en el documento, no por ejemplo la longitud del archivo adjunto actual. Es extraño que lo pruebes dentro del ciclo porque la expresión nunca cambiará.¿Estás intentando probar el tamaño de archivo adjunto ?

+0

¡Gracias! Cambiarlo a 'doc._attachments [attachment] .content_type' y' doc._attachments [attachment] .length' hizo el truco. Pero fyi hay más en la lógica, como permitir jpegs de cualquier longitud y otros criterios que no pegué. – degeeman

0

¿Cuál es la salida de rizo (es decir, de CouchDB) ?

Según su ejemplo, mi primera suposición es que tiene un error de cotización. Dentro de comillas simples, no necesita escaparse de las comillas dobles. Intente eliminar todas esas barras diagonales inversas. ¿Qué ocurre?

Si está en Windows, la comilla simple no es válida en el shell. En ese caso, mantenga las barras invertidas y simplemente cambie la comilla simple a una comilla doble.

+0

Gracias por su respuesta, he agregado la información a la publicación original. – degeeman

+0

por cierto. Estoy en Windows, intenté con cmd y PowerShell – degeeman

+0

Bien, la primera respuesta significa que no hay ningún error de sintaxis. No me di cuenta de que la cita única era válida en Windows. Siempre hago doble cita y luego escapo de todas mis comillas dobles dentro de eso. De todos modos, pasar a nuevas ideas. – JasonSmith