2015-09-17 20 views
6

Điều này thực sự boggling tâm trí của tôi. Tôi nhận được một lỗi gọi lại từ ajax. Nhưng nếu tôi lấy res.responseText (quay lại đúng, btw) từ thông báo lỗi và sử dụng nó, nó sẽ làm đúng. Cũng giống như tôi đã nhận được một cuộc gọi lại thành công.gọi jquery ajax trả về lỗi với trạng thái mô phỏng 4, trạng thái 200, statustext ok

Dữ liệu được thiết lập như thế này:

var dataToSend = {fieldname : textdata}; 

và cuộc gọi ajax là như thế này:

var ajaxOptions = { 
    url: '/newpage', 
    data: JSON.stringify(dataToSend), 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    cache: false, 
    processData: false, 
    type: 'POST', 
    success: function(res) { 
     console.log("success!"); 
     $('#' + divname).html(res); 
    }, 
    error: function(res) { 
     console.log("There was an error: " + JSON.stringify(res)); 
     $('#' + divname).html(res.responseText); 
    } 
}; 

$.ajax(ajaxOptions); 

Các thông báo lỗi là: Có một lỗi: {"readyState":4,"responseText" [this part is perfectly fine], "status":200, "statusText":"OK"}.

+0

'dataType: 'json',' đây là phản hồi mong đợi từ nguồn. bạn có thể chắc chắn rằng nguồn bạn đang nhấn đang tạo ra json như là kết quả không? nếu không thử sau khi gỡ bỏ nó. – Jai

+1

có vẻ như bạn đang trả lại văn bản/html .... do đó, lỗi có thể là lỗi phân tích cú pháp json. Loại bỏ 'dataType: 'json''. Hiển thị những gì thực sự được trả về – charlietfl

+0

@ Jai - Đó là một dự đoán tốt! Tôi đã thay đổi kiểu thành dữ liệu JSON trong cơ sở dữ liệu của mình, nhưng tôi vẫn gặp lỗi tương tự. – lynvie

Trả lời

8

Nếu responseText của bạn không phải là JSON chính xác, lỗi phân tích cú pháp sẽ được ném. Hoặc là đảm bảo phản hồi của bạn là JSON hoặc hợp lệ loại bỏ dataType: "json".

Từ jQuery docs:

dataType (default: Intelligent Guess (xml, json, script, or html))

Type: String

The type of data that you're expecting back from the server. If none is specified, jQuery will try to infer it based on the MIME type of the response (an XML MIME type will yield XML, in 1.4 JSON will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be returned as a string). The available types (and the result passed as the first argument to your success callback) are:

...

"json": Evaluates the response as JSON and returns a JavaScript object. Cross-domain "json" requests are converted to "jsonp" unless the request includes jsonp: false in its request options. The JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. As of jQuery 1.9, an empty response is also rejected; the server should return a response of null or {} instead. (See json.org for more information on proper JSON formatting.)

1

này sẽ xảy ra là khi bạn có dataType thiết lập để có được câu trả lời nhưng câu trả lời không phải là những gì bạn đặt trong datatype.

Vì vậy, trong trường hợp của bạn dataType: 'json', được đặt và như bạn đã đề cập trong phần nhận xét bạn đã đặt string ở phần phụ trợ, vì vậy bạn cần thay đổi kiểu dữ liệu thành text.

thay đổi kiểu dữ liệu của bạn để:

dataType: 'text', 
+0

Tôi đang sử dụng mongodb. Tôi có {type: Schema.Types.Mixed}. Khi tôi console.log var dataToSend nó in: "title": "Tiêu đề này." Sau đó tôi gửi nó với JSON.stringify (dataToSend). Đây có phải là không đủ để làm dữ liệu JSON không? – lynvie

+1

@lynvie, sự cố bạn đang gặp phải là với dữ liệu của người trả lời, chứ không phải với dữ liệu đã gửi. Bạn phải làm 'console.log (responseText)' và kiểm tra xem đó có phải là JSON không – Diego

0

Một cách để giải quyết vấn đề serverside được để echo một mảng trống rỗng, json mã hóa:

echo json_encode([]); 
return; 

Sau đó, chức năng thành công được kích hoạt thay vì các lỗi .

Hoặc chỉ thay đổi scriptide dataType: 'json', thành dataType: 'text', để yêu cầu jquery nhận được phản hồi văn bản.

Các vấn đề liên quan