2012-10-23 28 views
24

Hi all Tôi đang cố gắng để gửi một đối tượng javascript thông qua WebSockets:gửi một đối tượng javascript thông qua WebSockets với faye

tài liệu faye-WebSockets nói:

send (message)chấp nhận hoặc là một Chuỗi hoặc Bộ đệm và gửi một tin nhắn văn bản hoặc thông điệp nhị phân qua kết nối tới người khác.

phía máy chủ Tôi đang sử dụng nút và faye.

var WebSocket = require('faye-websocket'); 
var http = require('http'); 

var server = http.createServer(); 
server.addListener('upgrade', function(request, socket, head) { 
    var ws = new WebSocket(request, socket, head); 
    ws.send({topic:'handshake', data:'sdf487rgiuh7'}); 
}); 
server.listen(8000); 

phía khách hàng:

<script> 
    var ws = new WebSocket('ws://localhost:8000'); 
    ws.onmessage = function(e) { 
     console.log(e.data); //prints [Object object] string and not the object 
    }; 
</script> 

lỗi của tôi là gì? Cảm ơn

+0

người cho -1 giải thích lý do xin vui lòng .. – frx08

+3

Các -1 có thể do thực tế rằng các thông báo lỗi đã nói với bạn một cách chính xác chuyện gì thế. –

Trả lời

64

WebSockets hỗ trợ gửi và nhận: chuỗi, gõ mảng (ArrayBuffer) và Blobs. Các đối tượng Javascript phải được tuần tự hóa thành một trong các loại trên trước khi gửi.

Để gửi một đối tượng như là một chuỗi, bạn có thể sử dụng sự hỗ trợ JSON dựng sẵn:

ws.send(JSON.stringify(object)); 

Để gửi một đối tượng như là một mảng gõ bạn có thể sử dụng một thư viện BSON javascript như this one:

ws.send(BSON.serialize(object)); 

Khi bạn nhận được một tin nhắn WebSocket, bạn sẽ cần phải deserialize nó.

Để deserialize một chuỗi JSON từ một tin nhắn WebSocket:

ws.onmessage = function (e) { 
    var object = JSON.parse(e.data); 
    ... 
}; 

Nếu bạn đang sử dụng các thông điệp nhị phân trên WebSocket, thì trước tiên bạn nên thiết lập các thuộc tính binaryType để nhận được tất cả các thông điệp nhị phân như mảng gõ:

ws.binaryType = "arraybuffer"; 

Sau đó deserialization sẽ trông như thế này:

ws.onmessage = function (e) { 
    var object = BSON.deserialize(e.data); 
    ... 
}; 

Đây là một bài đăng trên blog về using BSON in Javascript;

+2

Liên kết của bạn đã chết:/Và không có bất kỳ readme.md nào trên git repo của js-bson. Gonna tìm kiếm một số tài liệu. – Vadorequest

+1

https://github.com/mongodb/js-bson – Vadorequest

+1

Có khả năng gọi lại 'onmessage' không trả về toàn bộ chuỗi json, và do đó' JSON.parse' ném một lỗi phân tích cú pháp? –

1

tôi về cơ bản làm việc với Socket.IO, nhưng có vẻ như bạn cần phải stringify dữ liệu của bạn trong máy chủ và phân tích nó trong các khách hàng như sau:

trong máy chủ:

ws.send(JSON.stringify({topic:'handshake', data:'sdf487rgiuh7'})); 

trong ứng dụng:

console.log(JSON.parse(e.data)); 
+0

trong trường hợp của bạn, bạn đang gửi một chuỗi nhưng vì faye hỗ trợ gửi dữ liệu nhị phân, tôi muốn khai thác tính năng này – frx08

+1

@ frx08 Một đối tượng JS không có dữ liệu nhị phân, một hình ảnh sẽ là. Vì vậy, câu trả lời udidus là chính xác. – dom

+1

vì vậy phương pháp duy nhất để sắp xếp một đối tượng js là để xâu chuỗi nó? – frx08

0

Chủ đầu tư:

const bson = new BSON(); 
ws.binaryType = 'arraybuffer'; 

ws.onmessage = function(event) { 
    console.log(bson.deserialize(Buffer.from(event.data))); 
} 

Server:

const data = bson.serialize({ ... }); 
ws.send(data); 
Các vấn đề liên quan