2015-01-12 17 views
10

Tôi có theo Backbone.js đangKhông thể tìm nạp JSON Trong bộ sưu tập Backbone

var List = Backbone.Collection.extend({ 
    model: Item, 
    url: '/api/items', 
}); 

và sau đó theo quan điểm của tôi, tôi đang cố gắng để làm như sau để lấy JSON từ API và cư trú trong mô hình

this.collection = new List(); 

var that = this; 
this.collection.fetch({ 
    success: function() { 
     that.render(); 
     console.log('Fetch successful!'); 
    }, 
    error: function() { 
     console.log('Failed to fetch!'); 
    } 
}); 

Tuy nhiên tìm nạp không hoạt động và kích hoạt tính năng tìm nạp "Không tìm nạp được!" thông điệp. Bất cứ ai có thể nhìn thấy bất cứ điều gì tôi đang làm sai? Nếu tôi truy cập vào api/items trong trình duyệt của mình, tôi được nhắc tải xuống tệp JSON để chắc chắn có tệp đó và khi tôi mở nó theo giới hạn mới của nó. Dưới đây là một đoạn mã api đó gửi lại JSON

res.writeHead(200, { 
    'Content-Type': 'application/x-json-stream' 
}); 

setTimeout(function() { 
    var i; 
    for (i=0; i<limit; i+=1) { 
     res.write(JSON.stringify(createRandomItem(i+skip, sort)) + '\n'); 
    } 
    res.end(); 
}, 100 + Math.floor(Math.random() * 3000)); 

Ngoài ra khi tôi sử dụng công cụ phát triển để kiểm tra các yêu cầu được gửi tới API phản ứng tôi nhận được lại chỉ có vẻ là nhân vật ngẫu nhiên và tôi nhận được lỗi "lỗi Cú pháp: JSON.parse: nhân vật bất ngờ"

eyJpZCI6IjAtd202MzNjYTF0Y3ZqOWs5Iiwic2l6ZSI6MTYsInByaWNlIjo5MzgsImZhY2 
+0

Chỉ thử 'res.send (200, {mảng/đối tượng của bạn/etc})' – benhowdle89

+0

Tôi không chắc chắn nhưng có thể để kiểu nội dung JSON trực tuyến không được hỗ trợ bởi triển khai JS trình duyệt của bạn không? AFAIK, Backbone sử dụng đối tượng 'XMLHttpRequest' đơn giản để xử lý yêu cầu các bộ sưu tập. Điều gì sẽ xảy ra nếu bạn sử dụng kiểu 'application/json' đơn giản? – VisioN

+0

Tôi đã thử thay đổi kiểu nội dung thành 'application/json' nhưng tôi nhận được kết quả tương tự.Ngoài ra tôi nên chỉ ra rằng nếu có thể tôi không muốn thay đổi mã phía máy chủ. – Bender

Trả lời

9

bạn loop viết phản ứng tạo ra chuỗi json không hợp lệ, vì nó chỉ nối đối tượng json.

Bạn có thể thu thập tất cả các đối tượng trong mảng và stringify nó như thế này:

setTimeout(function() { 
    var i, data = []; 
    for (i=0; i<limit; i+=1) { 
     data.push(createRandomItem(i+skip, sort)); 
    } 

    res.write(JSON.stringify(data)); 
    res.end(); 
}, 100 + Math.floor(Math.random() * 3000)); 
+0

Cảm ơn điều này làm việc nếu tôi cũng đã thay đổi kiểu nội dung thành 'application/json' nhưng có anyway tôi có thể làm cho nó hoạt động mà không cần thay đổi mã kết thúc? – Bender

+1

Bạn muốn bản gốc 'JSON.parse' có thể phân tích cú pháp JSON không hợp lệ? Tôi tin rằng điều đó là không thể. –

+1

@Bender, bạn sẽ cần tùy chỉnh 'Backbone.sync' để đọc phản hồi của máy chủ dưới dạng văn bản thuần, phân tách phản hồi bằng dấu phân cách (\ n trong trường hợp của bạn),' JSON.parse' từng cái một và sau đó thu thập chúng phía khách hàng. Tôi nghĩ tốt hơn hết là chỉ cần xuất JSON hợp lệ ở phía máy chủ. – ertrzyiks

4

Thông thường, khi bạn nhận được một JSON.parse: nhân vật bất ngờ lỗi, nó chỉ ra rằng các thuộc tính JSON không đúp quote đủ tiêu chuẩn, vì vậy về cơ bản JSON có thể trông như thế này:

"{ test: 1, testing: 2 }"   *Invalid* 

Hoặc ngay cả điều này:

"{ 'test': 1, 'testing': 2 }"  *Invalid* 

Thay vì như thế này:

'{ "test": 1, "testing": 2 }'  *Valid* 

Hoặc này:

"{ \"test\": 1, \"testing\": 2 }" *Valid* 
3

Đầu tiên điều đầu tiên. Bạn chắc chắn có vấn đề cấu hình máy chủ. Có vẻ như loại mime của bạn chưa được đặt và bạn đã bật (có thể nén gzip).

Sử dụng Google Chrome để duyệt đến URL phục vụ JSON. Trình duyệt sẽ hiển thị JSON ở dạng văn bản thuần túy mà không nhắc bạn tải xuống.

Tiếp theo, hãy tải tiện ích mở rộng JSONView cho Chrome. Duyệt đến URL phục vụ JSON. Bạn sẽ thấy JSON ở định dạng "đẹp" với các dấu ngoặc nhọn phù hợp.

Sau khi bạn làm điều đó, hãy quay lại ứng dụng web của bạn và kiểm tra. Nếu bạn vẫn gặp sự cố, hãy đăng thông tin máy chủ web của bạn (loại và phiên bản) và bất kỳ thông tin đặc biệt nào khác. Chúng ta sẽ đi từ đó.

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