就在这里。
1)
query就像
GET参数一样,因此请替换
"param:value"为
"param=value"(如果您想传递多个参数,请像通常使用URL:一样进行操作
param=value&some_other_param=test)
2)
handshaken在
connection处理程序中获取查询参数有一种更简单,更可靠的方法(因为没有访问对象的未定义属性的风险):
console.log(socket.handshake.query.param);
编辑:
学习完完整的代码后,我想我找出了导致问题的原因。问题是您可能误解了Socket.IO名称空间的主要思想。
我猜您
io.connect在一页内有多个Socket.IO连接(调用),对吗?通常,一个连接就足够了。您的错误是您调用
io.connect了鼠标事件,但是您应该在上调用一次
document.ready,然后才发出
emit声音。
看下面的代码(客户端):
$(document).ready(function() { var socket = io.connect('', {query: 'name=something'}); // [...] socket.on('some_event_from_server', function(data, cb) {}); // [...] $('#someButton').click(function() { socket.emit('markers_add', {some: 'data'}); //send `markers_add` message to server within main namespace }); $('#someOtherButton').click(function() { socket.emit('icon_sets_add', {some: 'thing'}, function(response) { //server may response to this request. see server side pre below }); });});服务器端代码:
io.on('connection', function(socket) { //connection handler of main namespace socket.on('markers_add', function(data) { }); socket.on('icon_sets_add', function(data, cb) { // do something cb({some: 'response'}); }); // [...] socket.emit('some_event_from_server', {}); //server sends a message to a client //BTW, now it should be OK: console.log(socket.handshake.query.name);});如果您有一个名称空间,它应该可以工作。我实际上不知道这是Socket.IO的错误还是名称空间使用不当的结果,但是修改代码以仅创建一个名称空间应该可以解决问题。因此,就您而言,您根本不必在握手时传递查询参数。
实际上,如果要使您的应用程序更安全,则必须使用查询参数。请参阅http://wlkns.co/node-js/socket-io-
authentication-tutorial-server-and-client/(对于Socket.io 0.9)
希望我的回答对您有所帮助。祝好运!



