2014-06-19 12 views
8

Tôi đã tạo API tối giản trên nodejs để trả về dữ liệu ở định dạng JSON.Mã thông báo không xác định của dấu hai chấm JSON sau jQuery.ajax # get

Nhưng mỗi khi tôi cố gắng thực hiện ajax # nhận cuộc gọi và chuyển API của tôi dưới dạng URL, tôi sẽ gặp lỗi và đánh giá từ Chrome, tôi gặp lỗi "Unexpected token :";

đây mã máy chủ trong nodejs + bày tỏ:

var 
http = require('http'), 
express = require('express'), 
app  = express(), 
server = http.createServer(app); 

app.get('/', function(req, res) { 
    console.log('req received'); 
     res.setHeader('Content-Type', 'application/json'); 
    res.end(JSON.stringify({ 
    Name : "Tom", 
    Description : "Hello it's me!" 
    })); 

}); 

server.listen(3000, function() { 
    console.log('Listening on 3000'); 
}); 

Các JSON trở về từ "/" là: {"Name":"Tom","Description":"Hello it's me!"}.

Đây là cuộc gọi của tôi từ js khách hàng:

$.ajax({ 
    url: findUrl, 
    type: 'get', 
    dataType: 'jsonp', 
    success: function (data) { 
     self.name(data.Name); 
     self.description(data.Description); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     alert(errorThrown); 
    } 
}); 

Khi vẽ lỗi tôi nhận được: "jQuery111108398571682628244_1403193212453 was not called"

Ai đó có thể giúp tôi?

Tôi biết câu hỏi này đã được hỏi nhưng tôi chưa tìm được giải pháp sửa chương trình của mình.

+0

Kiểm tra 'datatype của bạn '- [$ .ajax()] (http://api.jquery.com/jquery.ajax/) – Andreas

+0

@Andreas: Tôi đoán bạn đề cập đến" jsonp ", tôi đã đổi thành" json ". Bây giờ tôi nhận được "XMLHttpRequest không thể tải http: // localhost: 3000 /. Không có tiêu đề 'Access-Control-Allow-Origin' xuất hiện trên tài nguyên được yêu cầu. Do đó, origin 'null' không được phép truy cập." Làm thế nào tôi có thể sửa lỗi này ? –

Trả lời

9

Để hỗ trợ JSONP requests, máy chủ sẽ phải bao gồm các P, hoặc "Padding," trong phản ứng.

jQuery111108398571682628244_1403193212453({"Name":"Tom","Description":"Hello it's me!"}) 

Các lỗi cú pháp, "Unexpected token :", là bởi vì JSONP được phân tách như JavaScript, nơi {...} cũng đại diện cho blocks. Nó chỉ tận dụng cú pháp tương tự của JSON và JavaScript để xác định dữ liệu được truyền tới một cuộc gọi hàm toàn cầu.

Theo mặc định, jQuery sẽ bao gồm một tham số callback truy vấn-string với tên của hàm:

var callback = req.query.callback; 
var data = JSON.stringify({ 
    Name : "Tom", 
    Description : "Hello it's me!" 
}); 

if (callback) { 
    res.setHeader('Content-Type', 'text/javascript'); 
    res.end(callback + '(' + data + ')'); 
} else { 
    res.setHeader('Content-Type', 'application/json'); 
    res.end(data); 
} 

ExpressJS cũng bao gồm res.jsonp() rằng đã thực hiện điều kiện này:

app.get('/', function(req, res) { 
    console.log('req received'); 

    res.jsonp({ 
     Name : "Tom", 
     Description : "Hello it's me!" 
    }); 
}); 
-3

Bạn muốn sử dụng datatype: "json" thay vì "jsonp"

+0

có nhiều lý do khác nhau tại sao bạn muốn sử dụng jsonp, một ví dụ là có thể gọi qua các miền khác nhau –

+0

đồng ý, jsonp dành cho CORS, bạn không thể chỉ sử dụng json nếu bạn cần thực hiện yêu cầu async miền chéo thông qua javascript . – Karl

+1

JSONP không dành cho CORS. JSONP là bản hack chúng tôi sử dụng trước khi CORS được phát triển và hỗ trợ bởi trình duyệt. – Quentin

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