2013-04-23 53 views
6

Tôi đang cố gắng kích hoạt XMLHttpRequest tới mongoDB để truy xuất tài liệu qua AJAX.Yêu cầu REST AJAX đến mongoDB

Đây là mã của tôi:

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); 
     } 
    }); 
} 

chức năng của tôi luôn luôn trả về một lỗi. Vì vậy, vấn đề là gì?

+1

lỗi là gì? – andyb

+0

yêu cầu ajax không thành công với tập lệnh, thay vào đó nếu tôi sao chép url trong trình duyệt, phản hồi của máy chủ với thành công. tôi không biết vấn đề là gì ... – ilamaiolo

+0

Lỗi cảnh báo là Jqueryxxxxxx không được gọi! – ilamaiolo

Trả lời

6

Chức năng này được hỗ trợ như một phần của Simple (read-only) REST Interface nhưng để làm cho miền chéo yêu cầu --jsonp nếu không bạn sẽ phải chịu các vấn đề Same origin policy, vì địa chỉ IP và cổng mà bạn đang đưa ra yêu cầu từ không khớp với địa chỉ IP và cổng mà mongoDB đang chạy.

Bắt đầu mongoDB với mongod.exe --rest --jsonp (cộng với bất kỳ tùy chọn nào khác bạn có thể có).

Trang ví dụ sau có thể được phân phát qua máy chủ web (ví dụ: Apache HTTP Server) hoặc được lưu cục bộ và được tải trong trình duyệt dưới dạng tệp . Yêu cầu là cung cấp thông tin về một dbCollection gọi andyb, mà tôi tạo ra trong MongoDB đầu tiên với:

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> 

Nhiều trình duyệt hỗ trợ CORS bây giờ mà là một sự thay thế (hiện đại hơn) để tạo điều kiện cho các tài nguyên miền chéo.

+0

Cảm ơn rất nhiều phản hồi của bạn! – ilamaiolo

0

Câu trả lời trước đó có thể thay đổi bằng cách sử dụng đối tượng trì hoãn (xem hướng dẫn này tốt: "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> 

Dù sao, trong cả hai trường hợp các error:fail() xử lý chỉ hoạt động nếu một cổng không được cung cấp . Ví dụ:

url:"localhost/asdasdasd" 

kết quả trong một xử lý lỗi, trong khi

url:"localhost:28017/asdasdasd" 

kết quả trong một bản ghi 404 trong giao diện điều khiển, như thế này:

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