You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:42:00