使用Socket.io如何获取发送消息的客户端用户?
实现逻辑
Socket.io 每个连接对应的socket实例是唯一绑定当前用户的,你只要在用户建立连接的时候把身份信息和socket实例绑定,后续该用户触发的所有事件都能直接从socket上拿到用户信息。
你当前的代码存在语法小错误:回调的闭合写反了,应该是})不是)}。
具体实现步骤
1. 客户端传递身份凭证
用户连接的时候需要把身份标识(比如登录态token、自定义昵称)传给服务端,推荐用auth字段传递,兼容性更好:
// 客户端代码示例 import { io } from "socket.io-client"; // 登录后拿到的token存在本地,连接的时候带上 const socket = io("你的服务端地址", { auth: { token: localStorage.getItem("userToken") } });
2. 服务端解析身份并绑定到socket
连接建立后直接从socket的handshake字段拿到客户端传的凭证,解析出用户信息后挂载到socket实例上:
// 服务端代码示例,用到jsonwebtoken解析token,没有的话先执行npm install jsonwebtoken安装 const jwt = require("jsonwebtoken"); // 你生成jwt时用的加密密钥,注意保密不要泄露 const JWT_SECRET = "your_jwt_secret_key"; io.on('connection', async (socket) => { // 取客户端传的token const token = socket.handshake.auth.token; try { // 解析token得到用户信息(id、昵称等你存在token里的字段) const user = jwt.verify(token, JWT_SECRET); // 挂载到socket上,后续该socket的所有事件都能访问 socket.currentUser = user; console.log("用户连接成功:", socket.currentUser.nickname); } catch (err) { // token无效/过期,直接断开连接 socket.disconnect(); return; } // 监听用户发送消息的事件 socket.on("sendMessage", (msgContent) => { // 这里直接就能拿到发送消息的用户信息 const sendUser = socket.currentUser; console.log("发送者信息:", sendUser, "消息内容:", msgContent); // 把消息广播给所有在线用户,带上发送者信息 io.emit("newMessage", { content: msgContent, sender: sendUser, time: Date.now() }); }); });
无登录场景简化方案
如果你的场景不需要登录,只是游客自定义昵称的场景,可以简化处理,客户端连接的时候直接传昵称:
// 客户端 const socket = io("你的服务端地址", { query: { nickname: "用户自定义的昵称" } });
服务端直接取了挂载即可:
io.on('connection', async (socket) => { socket.currentUser = { nickname: socket.handshake.query.nickname, id: socket.id // 用socket.id当临时用户id }; // 后续监听sendMessage事件同样能拿到用户信息 });
注意事项
- 不要把用户敏感信息(比如密码、手机号)挂载到socket实例上,避免信息泄露
- 如果用户信息中途有更新,可以主动更新
socket.currentUser的对应字段
内容的提问来源于stack exchange,提问作者Liam Sholts
相关产品推荐
相关产品推荐

