2015-04-29 14 views
9

Các tài liệu nói socket.io không hỗ trợ .get .set tạiLàm thế nào để lưu trữ dữ liệu của khách hàng liên quan trong socket.io 1.0

Is it okay để lưu trữ dữ liệu của khách hàng liên quan như

io.sockets.on('connection', function (client) { 
    client.on('data', function (somedata) {    
     client['data'] = somedata; 
    });  
}); 

trong trường hợp tôi cần nhiều nút?

+0

biến 'client' là gì? Bạn đang thiếu một loạt ngữ cảnh ở đây để mọi người có thể trả lời. – jfriend00

+0

@ jfriend00 cập nhật – Herokiller

Trả lời

15

Có, bạn có thể thêm thuộc tính vào đối tượng socket.io socket. Bạn nên cẩn thận để không sử dụng tên có thể xung đột với các thuộc tính hoặc phương thức dựng sẵn (tôi khuyên bạn nên thêm dấu gạch dưới hàng đầu hoặc cách đặt tên chúng với một số tiền tố tên). Nhưng một socket chỉ là một đối tượng Javascript và bạn có thể tự do thêm các thuộc tính như thế này với điều kiện là bạn không gây ra bất kỳ xung đột nào với các thuộc tính hiện có.

Có nhiều cách khác để thực hiện việc này sử dụng socket.id làm khóa trong cấu trúc dữ liệu của riêng bạn.

var currentConnections = {}; 
io.sockets.on('connection', function (client) { 
    currentConnections[client.id] = {socket: client}; 
    client.on('data', function (somedata) { 
     currentConnections[client.id].data = someData; 
    });  
    client.on('disconnect', function() { 
     delete currentConnections[client.id]; 
    }); 
}); 
+1

là thông tin này có sẵn cho khách hàng xem/thay đổi không? –

+0

@Alex_Nabu - Không. Dữ liệu như đối tượng 'curentConnections' là dữ liệu phía máy chủ và là riêng tư với máy chủ. – jfriend00

+1

xin lỗi có nghĩa là nếu tôi đã đính kèm dữ liệu vào socket obj nếu nó có thể thay đổi được với máy khách. Bây giờ tôi thấy những gì bạn đã làm. tôi đã có một thời điểm duh –

8

Có, điều đó có thể miễn là không có thuộc tính dựng sẵn khác có cùng tên.

io.sockets.on('connection', function (client) { 
    client.on('data', function (somedata) { 
     // if not client['data'] you might need to have a check here like this 
     client['data'] = somedata; 
    });  
}); 

tôi muốn đề nghị một cách khác, nhưng với ECMAScript 6 weak maps

var wm = new WeakMap(); 

io.sockets.on('connection', function (client) { 
    client.on('data', function (somedata) { 
     wm.set(client, somedata); 
     // if you want to get the data 
     // wm.get(client); 
    }); 
    client.on('disconnect', function() { 
     wm.delete(client); 
    }); 
}); 
Các vấn đề liên quan