2013-04-23 13 views
6

Ich versuche ein XMLHttpRequest zu mongoDB zu feuern, um ein Dokument über AJAX zu erhalten.REST AJAX Anfrage an mongoDB

Dies ist mein Code:

function getJsonDocumentByModeldid(model_id) { 
    var valoreInput = document.getElementById('inputModelId').value; 
    alert(valoreInput); 

    $.ajax({ 
     url: "http://localhost:28017/test/", 
     type: "get", 
     //data: "filter_a=" + valoreInput, 
     dataType: 'jsonp', 
     crossDomain: true, 

     success: function (data) { 
     alert("success"); 
     //var json2javascript = $.parseJSON(data); 
     manageLayout(); 
     }, 

     error: function (XMLHttpRequest, textStatus, errorThrown) { 
     alert("Status: " + textStatus + " Error:" + errorThrown); 
     } 
    }); 
} 

Meine Funktion einen Fehler immer wieder. Also, wo liegt das Problem?

+1

Was ist der Fehler? – andyb

+0

die Ajax-Anfrage scheitert mit dem Skript, stattdessen, wenn ich URL im Browser kopieren, die Server-Antwort mit Erfolg. Ich weiß nicht, was das Problem ist ... – ilamaiolo

+0

Der Alert-Fehler ist Jqueryxxxxxx wurde nicht aufgerufen! – ilamaiolo

Antwort

6

Diese Funktionalität als Teil des Simple (read-only) REST Interface unterstützt wird, aber Cross-Domain zu machen fordert die --jsonp sonst werden Sie zum Same origin policy Problem unterliegen, da die IP-Adresse und Port, den Sie die Anfrage aus machen Sie die IP-Adresse nicht überein und Port, auf dem mongoDB läuft.

Starten Sie mongoDB mit mongod.exe --rest --jsonp (plus alle anderen Optionen, die Sie möglicherweise haben).

Die folgende Beispielseite kann über einen Web-Server bedient werden (z. B. Apache HTTP Server) oder einfach lokal gespeichert und im Browser als Datei geladen werden. Die Anfrage ist für Informationen über ein dbCollection genannt AndyB, die ich in mongoDB erstellt zuerst mit:

db.createCollection('andyb'); 

HTML

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
    <title>mongoDB AJAX demo</title> 
    <script type='text/javascript' src='http://code.jquery.com/jquery-1.9.1.js'></script> 
    <script type='text/javascript'>//<![CDATA[ 
    $(function(){ 
    $.ajax({ 
     url: 'http://localhost:28017/local/andyb', 
     type: 'get', 
     dataType: 'jsonp', 
     jsonp: 'jsonp', // mongod is expecting the parameter name to be called "jsonp" 
     success: function (data) { 
     console.log('success', data); 
     }, 
     error: function (XMLHttpRequest, textStatus, errorThrown) { 
     console.log('error', errorThrown); 
     } 
    }); 
    });//]]> 
    </script> 
</head> 
<body> 
</body> 
</html> 

Viele Browser CORS jetzt unterstützen, die eine Alternative (modernere) Möglichkeit, Cross-Domain-Ressourcen zu erleichtern.

+0

Vielen Dank für Ihre Antwort! – ilamaiolo

0

Die bisherige Antwort kann durch die Verwendung der latenten Objekte modifiziert werden (diese gute Anleitung siehe: "How do I return the response from an asynchronous call?):

<!doctype html> 
<meta charset="utf-8"> 
<title>mongoDB AJAX demo</title> 
<script src="http://code.jquery.com/jquery-latest.min.js" ></script> 
<script>  
    $(function(){ 
    // add rest = true and jsonp = true to /etc/mongodb.conf, 
    // then restart mongodb 
     $.ajax({ 
       url: "http://localhost:28017/local/startup_log/", 
       type: 'get', 
       dataType: 'jsonp', 
       jsonp: 'jsonp', // mongodb is expecting that                      
      }) 
      .done(function(data) { 
       d=JSON.stringify(data,undefined,1); 
       $("code").text(d).css("color","green"); 
      }) 
      .fail(function(request,status,error) { 
       $("code").text("get failed: "+error).css("color","red"); 
      }) 
      .always(function() { 
       console.log("finished") 
      }) 

    }); 
</script> 
<body> 
    <pre> 
    <code> 
    </code> 
    </pre> 

, jedenfalls in beiden Fällen die error: und fail() Handhabung ist nicht nur vorgesehen, wenn ein Port arbeitet . Zum Beispiel:

url:"localhost/asdasdasd" 

führt zu einer Fehlerbehandlung, während

url:"localhost:28017/asdasdasd" 

Ergebnisse in einem 404-Protokoll in der Konsole wie folgt aus:

GET http://localhost:28017/?jsonp=jQuery110207253803350031376_1383522587177&_=1383522587178 404 (OK)