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

如何导出Socket.io函数实现接口触发客户端消息推送

解决在Express路由中调用Socket.io发送消息的问题

方案1:将io实例通过路由传递

修改server.js,在引入路由时传入io实例:

// server.js
const express = require("express");
const app = express();

const server = require("http").createServer(app);
const io = require("socket.io")(server, {
  cors: {
    origin: "http://localhost:3000",
    methods: ["GET", "POST"],
  },
});

// 把io传入路由模块
const testRoutes = require("./routes/testRoutes")(io);

// Socket.io连接逻辑保持不变
io.on("connection", (socket) => {
  console.log("socket on");
  socket.on("newMessageToServer", ({ message, username }) => {
    console.log("messagefromclient", message, username);
    io.emit("newMessageToClient", { message, username });
  });
});

app.use("/test", testRoutes);

const port = process.env.port || 5000;
server.listen(port, () => {
  console.log("listening " + port);
});

修改testRoutes.js,接收并使用io实例:

// testRoutes.js
const express = require("express");

module.exports = function(io) {
  const router = express.Router();

  router.post("/test", async (req, res) => {
    console.log("testsocket");
    // 直接调用io发送消息
    io.emit("newMessageToClient", { 
      message: "接口触发的推送消息", 
      username: "系统通知" 
    });
    res.status(200).send("消息已推送");
  });

  return router;
};

方案2:导出io实例供路由引用

在server.js中导出io实例:

// server.js
// ... 原有代码
const io = require("socket.io")(server, {
  cors: {
    origin: "http://localhost:3000",
    methods: ["GET", "POST"],
  },
});

// 导出io实例
module.exports.io = io;

// ... 后续逻辑不变

在testRoutes.js中引入并使用:

// testRoutes.js
const express = require("express");
const router = express.Router();
// 引入server.js中的io实例
const { io } = require("../server");

router.post("/test", async (req, res) => {
  console.log("testsocket");
  io.emit("newMessageToClient", { 
    message: "接口触发的推送消息", 
    username: "系统通知" 
  });
  res.status(200).send("消息已推送");
});

module.exports = router;

方案3:用Express的app.set存储io实例

在server.js中将io存入app设置:

// server.js
// ... 原有代码
const io = require("socket.io")(server, {
  cors: {
    origin: "http://localhost:3000",
    methods: ["GET", "POST"],
  },
});

// 将io存入app的全局设置
app.set("io", io);

// ... 后续逻辑不变

在testRoutes.js中通过req.app获取:

// testRoutes.js
const express = require("express");
const router = express.Router();

router.post("/test", async (req, res) => {
  console.log("testsocket");
  // 从app设置中取出io实例
  const io = req.app.get("io");
  io.emit("newMessageToClient", { 
    message: "接口触发的推送消息", 
    username: "系统通知" 
  });
  res.status(200).send("消息已推送");
});

module.exports = router;

关键注意点

  • 确保io实例初始化完成后再传递/存储,避免未实例化导致的错误
  • 若选择方案2,Node.js模块缓存机制会处理循环引用(server引入路由、路由引入server),无需额外处理
  • 可根据需求选择推送范围:io.emit推给所有客户端,socket.emit推给单个客户端,socket.broadcast.emit推给除当前连接外的所有客户端

内容的提问来源于stack exchange,提问作者Bn'R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:37:26