2010-07-30 13 views
11

En la actualidad, la aplicación web tiene que ofrecer algún tipo de encabezado HTTP entre dominios para acceder a los datos en otro dominio: http://openfontlibrary.org/wiki/Web_Font_linking_and_Cross-Origin_Resource_SharingCouchDB acceso de dominio cruzado de XMLHttpRequest?

¿Hay alguna manera de configurar CouchDB para apoyar el acceso entre dominios ilimitados? (Puede usar apache httpd internamente) Estoy usando el propósito interno de db solamente.

+0

Lamentablemente, el enlace está muerto por ahora y vuelve a colocar una página de error 404. – MKroehnert

+0

@MKroehnert Oh. Y me está volviendo loco que ni siquiera puedo recordar lo que quería hacer hace tres años. – Eonil

Respuesta

8

Puede usar una función de show CouchDB para establecer el encabezado Access-Control-Allow-Origin.


function(doc, req) { 
    return { 
    body : 'whatever', 
    headers : { 
     "Access-Control-Allow-Origin": "\"*\"" 
    } 
    } 
} 

Más información sobre el espectáculo funciona aquí: http://guide.couchdb.org/draft/show.html

+0

esto lamentablemente no es compatible con POST, PUT y DELETE :(¿hay alguna manera de respaldar estos métodos? –

14

La manera más fácil que he encontrado para resolverlo es mediante el uso localmente instalado servidor Web Apache con activado módulo mod_proxy y configurado ProxyPass Directiva.

deje que se inicie con la configuración básica

index.html tiene el siguiente contenido

<html> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 

var http = XMLHttpRequest(); 
http.open('GET', 'http://127.0.0.1:5984/_all_dbs', true); // ! WE WILL CHANGE THIS LINE 
http.onreadystatechange = function() { 
    if (http.readyState == 4 && http.status == 200) { 
     console.debug('it works'); 
    } 
}; 
http.send(null) 
</script> 
<head><title>Test Access to CouchDB</title></head> 
<body> 
</body> 
</html> 

Si lo intenta ahora no funcionará debido al problema de dominios (en este caso, los puertos no coinciden con 8181! = 5984) .

Cómo solucionarlo

  • configurar Apache (APACHE_HOME/conf/httpd.conf)
    • uncomment LoadModule proxy_module modules/mod_proxy.so
    • uncomment LoadModule proxy_http_module modules/mod_proxy_http.so
    • añadir ProxyPass /couchdb http://127.0.0.1:5984 (como se propiedad de nivel superior Y como ServerAdmin)
    • reiniciar Apache
  • modificar índice.html
    • reemplazar http.open('GET', 'http://127.0.0.1:5984/_all_dbs', true); con http.open('GET', '/couchdb/_all_dbs', true);

Pruebe ahora y debería ver 'funciona' de salida en la consola de Javascript (utilicé Firebug consola)

3

Eonil, quiero El acceso de dominio cruzado también, pero no es compatible con CouchDB, , puede votar para que la función se implemente aquí: https://issues.apache.org/jira/browse/COUCHDB-431

ps: esa solicitud de función se ha creado el 23/Jul/09 :(Espero que nos escuchen.

+0

Gracias por informarme. ¡He votado! Creo que la característica del protocolo HTTP REST es simplemente un tipo de azúcar sintáctico Se debería ofrecer una función conveniente al mismo tiempo, pero no espero que la gente de CouchDB haga esto porque supongo que están haciendo algún tipo de negocio, ya no necesitan el cuidado de los usuarios habituales. Y le recomiendo que compruebe * OrientDB * también por ofrecer una interfaz HTTP REST rápida y conveniente. Sin embargo, he decidido volver a PostgreSQL. – Eonil

+0

Gracias! No sabía de OrientDB, su lista de características parece muy interesante, en mi caso, encontré HTTP REST útil (o necesario) ya que planeo acceder al almacenamiento de db desde el navegador del cliente usando jQuery. Lo que más me entusiasma de CouchDB es que las vistas estáticas usando MapReduce son el único mecanismo de consulta! – Benja

1

La forma en que he resuelto este es escribir un 2 línea de Rebol envoltorio CGI y luego pedir mi Ajax en jQuery para llamar a mi CGI en lugar de la URL para obtener los datos de couchdb:

Rebol [ 

    {wrapper to overcome cross-domain fetching of data from couchdb} 
] 
print "Content-type: application/json^/" ;text/plain^/" 
print read http://127.0.0.1:5984/syncspace/_design/vals/_view/xxxx?group=true 
1

me hizo una lista que devuelve jsonp ... pero aún así sólo lectura apoyar

"jsonp": "function(head, req) { 
    var row; 
    var rows=[]; 
    while(row = getRow()){ 
     rows.push(row); 
    } 
    rj = JSON.stringify({\"rows\" : rows,\"total_rows\":rows.length}); 
    return req.query.callback+\"(\"+rj+\");\"; 
}", 
4

CouchDB 1.3 soluciona esto con CORS: https://wiki.apache.org/couchdb/CORS

+0

Aviso para todos instalando couchdb en debian/ubuntu a través del administrador de paquetes. A partir de hoy (10-oct-2014), la versión que obtendrá es 1.2 y NO es compatible con las opciones de CORS. Si desea usarlos, debe instalar nunca la versión de las fuentes. Me llevó un poco darme cuenta de por qué mi configuración de CORS no funcionaba, y la razón era que la había instalado a través de apt-get install couchdb y era la versión 1.2. – szydan

3

debe permitirle CORS in CouchDB> 1.3. Esto es tan simple como editar su default.ini y configurar enable_cors = true y luego modificar origins en la sección [cors] para tener las direcciones URL de nivel superior que necesita. Por ejemplo, tuve que hacer lo siguiente para incluir en la lista blanca mi servidor de grunt local.

enable_cors = true 
[cors] 
origins = http://127.0.0.1:9000 

para responder plenamente a esta pregunta, aunque te desea establecer

origins = * 

aunque esto podría argumentar que ser una vulnerabilidad, y probablemente debería restringir los orígenes más.

+0

Aviso para todos instalar couchdb en debian/ubuntu a través del administrador de paquetes. A partir de hoy (10-oct-2014), la versión que obtendrá es 1.2 y NO es compatible con las opciones de CORS.Si desea usarlos, debe instalar nunca la versión de las fuentes. Me llevó un poco darme cuenta de por qué mi configuración de CORS no funcionaba, y la razón era que la había instalado a través de apt-get install couchdb y era la versión 1.2. – szydan

Cuestiones relacionadas