Socket.io服务器启动失败:TypeError: Server不是构造函数
问题:Express结合Socket.io启动时报错TypeError: Server is not a constructor
我正尝试结合Express.js运行Socket.io,以下是我的server.js代码:
const express = require("express"); const app = express(); const http = require("http"); const cors = require("cors"); const Server = require("socket.io"); app.use(cors()); const server = http.createServer(app); const io = new Server(server, { cors: { origin: "http://localhost:3000", methods: ["GET", "POST"], }, }); io.on("connection", (socket) => { console.log(`User connected: ${socket.id}`); socket.on("Disconnect", () => { console.log(`User disconnected: ${socket.id}`); }); }); server.listen(3000, () => { console.log("SERVER WALKING"); });
运行nodemon server.js后出现如下报错:
const io = new Server(server, { ^ TypeError: Server is not a constructor at Object.<anonymous> (Path:10:12) at Module._compile (node:internal/modules/cjs/loader:1105:14) at Module._extensions..js (node:internal/modules/cjs/loader:1159:10) at Module.load (node:internal/modules/cjs/loader:981:32) at Module._load (node:internal/modules/cjs/loader:827:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12) at node:internal/main/run_main_module:17:47 Node.js v18.0.0 [nodemon] app crashed - waiting for file changes before starting...
我已经尝试用npm和yarn删除并重新安装node_modules,但报错仍未解决,请问哪里操作有误?
解决方案
核心问题是Socket.io的导入方式错误:Socket.io v3及以上版本的CommonJS模块中,Server是命名导出,不是默认导出。你当前的写法
const Server = require("socket.io");拿到的是整个模块对象,不是构造函数,所以会报错Server is not a constructor。需要改成命名导入:const { Server } = require("socket.io");或者:
const Server = require("socket.io").Server;另外还有一个隐性问题:Socket.io的断开连接事件名是小写的
disconnect,你代码里写的是大写的Disconnect,这个事件不会被触发,需要修正。
修正后的完整代码:
const express = require("express"); const app = express(); const http = require("http"); const cors = require("cors"); const { Server } = require("socket.io"); app.use(cors()); const server = http.createServer(app); const io = new Server(server, { cors: { origin: "http://localhost:3000", methods: ["GET", "POST"], }, }); io.on("connection", (socket) => { console.log(`User connected: ${socket.id}`); socket.on("disconnect", () => { console.log(`User disconnected: ${socket.id}`); }); }); server.listen(3000, () => { console.log("SERVER RUNNING"); });
内容的提问来源于stack exchange,提问作者Talha
相关产品推荐
相关产品推荐

