服务端声明Socket的username变量后客户端访问返回undefined问题咨询
问题原因
核心逻辑是服务端Socket实例和客户端Socket实例是完全独立的两个运行对象,Socket.io框架本身没有自定义属性跨端自动同步的能力:
- 你在服务端给socket对象挂载的
username属性,仅存储在服务端对应socket实例的内存中,不会主动同步到客户端的socket对象上 socket.id是Socket.io内置的标准属性,框架会在连接建立阶段自动完成两端的ID同步,所以客户端可以直接读取到该值
错误写法说明
- 客户端执行
console.log(socket.username)时,本地的socket实例从未被赋值过username属性,所以输出undefined - 直接执行
console.log(username)是读取全局作用域下的username变量,你没有提前定义过该全局变量,自然也无法获取到值
正确实现方案
如果需要把服务端的自定义属性同步给客户端,需要主动通过事件推送实现:
- 服务端连接建立后主动推送自定义属性
io.on('connection', (socket) => { socket.username = 'john'; // 给当前连接主动推送用户信息 socket.emit('userInfo', { username: socket.username }); });
- 客户端监听对应事件获取数据
const userInfo = {}; socket.on("connect", () => { console.log(socket.id); // 内置属性可正常读取 }); // 监听服务端推送的用户信息事件 socket.on('userInfo', (data) => { Object.assign(userInfo, data); console.log(userInfo.username); // 可正常输出 john });
内容的提问来源于stack exchange,提问作者user9638079
相关产品推荐
相关产品推荐

