CouchDB междоменный доступ из XMLHttpRequest? - PullRequest
11 голосов
/ 30 июля 2010

В настоящее время веб-приложение должно предлагать некоторый междоменный HTTP-заголовок для доступа к данным в другом домене: http://openfontlibrary.org/wiki/Web_Font_linking_and_Cross-Origin_Resource_Sharing

Есть ли способ настроить CouchDB для поддержки неограниченного междоменного доступа?(он может использовать Apache httpd внутри). Я использую только внутреннюю базу данных.

Ответы [ 7 ]

14 голосов
/ 23 октября 2010

Я нашел самый простой способ решить эту проблему - использовать локально установленный веб-сервер Apache с включенным модулем mod_proxy и настроенной директивой ProxyPass .

Давайте начнем с базовой настройки

index.html имеет следующее содержание

<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>

Если вы попробуете это только сейчас, это не будет работать из-за междоменной проблемы (в этом случае порты не соответствуют 8181! = 5984).

Как это исправить

  • настроить Apache (apache_home / conf / httpd.conf)
    • раскомментировать LoadModule proxy_module modules/mod_proxy.so
    • раскомментировать LoadModule proxy_http_module modules/mod_proxy_http.so
    • добавить ProxyPass /couchdb http://127.0.0.1:5984 (как свойство верхнего уровня, например ServerAdmin)
    • перезагрузите Apache
  • изменить index.html
    • заменить http.open('GET', 'http://127.0.0.1:5984/_all_dbs', true); на http.open('GET', '/couchdb/_all_dbs', true);

Попробуйте сейчас, и вы должны увидеть вывод 'it works' в консоли javascript (я использовал Firebug Console)

8 голосов
/ 29 августа 2010

Вы можете использовать функцию шоу CouchDB для установки заголовка Access-Control-Allow-Origin.


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

Подробнее о функциях шоу здесь: http://guide.couchdb.org/draft/show.html

4 голосов
/ 14 апреля 2013

CouchDB 1.3 решает эту проблему с помощью CORS: https://wiki.apache.org/couchdb/CORS

3 голосов
/ 13 декабря 2013

Вы должны включить CORS в CouchDB > 1.3.Это так же просто, как редактирование default.ini и установка enable_cors = true, а затем изменение origins в разделе [cors], чтобы получить URL верхнего уровня, которые вам нужны.Например, мне пришлось сделать следующее, чтобы добавить в белый список мой локальный сервер.

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

, чтобы полностью ответить на этот вопрос, хотя вы бы хотели установить

origins = *

, хотя это можно утверждатьбыть уязвимостью, и вам, вероятно, следует более ограничить происхождение.

3 голосов
/ 25 февраля 2011

Eonil, я тоже хочу кросс-доменный доступ, но он не поддерживается CouchDB, вы можете проголосовать за эту функцию, которая будет реализована здесь: https://issues.apache.org/jira/browse/COUCHDB-431

ps: запрос этой функции был создан 23/ Jul / 09 :( Надеюсь, они нас услышат.

1 голос
/ 02 февраля 2012

Я сделал список, который возвращает JSONp ... но все еще поддерживает только чтение

"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+\");\";
}",
1 голос
/ 08 января 2012

Я решил это, написав 2-строчный CGI-оболочку Rebol, а затем попросил мой Ajax в Jquery вызвать мой CGI вместо URL для получения данных из 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
...