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

Node.js结合EJS与Router使用Socket.io遇客户端404错误求助

问题分析与解决方案

首先,你的问题根源在服务端的服务器启动逻辑上,这直接导致Socket.io无法正常提供客户端脚本,进而引发了404和io is not defined的连锁错误。

核心错误点

你已经创建了绑定Socket.io的http服务器实例,但最后却用app.listen()启动服务——Express的app.listen()会内部新建一个独立的HTTP服务器,和你之前绑定Socket.io的那个http实例完全没关系。这就导致Socket.io的服务端根本没在运行,自然无法响应/socket.io/socket.io.js的请求,客户端也就找不到这个关键脚本了。

具体修复步骤

  1. 修正服务器启动代码:
    把最后一行的app.listen(...)替换成http.listen(...),确保启动的是绑定了Socket.io的那个HTTP服务器:

    // 替换原来的app.listen调用
    http.listen(PORT, console.log(`Server started on port ${PORT}`));
    
  2. 调整module.exports的位置:
    你现在把module.exports = router;放在了代码最顶部,这会导致后面所有的中间件配置、路由挂载都不会生效。请把这行移到文件的最后:

    // 把这行从顶部移到文件末尾
    module.exports = router;
    

修复后的app.js核心片段

const express = require('express');
const app = express();
const router = express.Router();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.set('socketio', io);
const expressLayouts = require('express-ejs-layouts');

app.use(express.static(__dirname));
app.use(express.urlencoded({ extended: true }));
app.use(expressLayouts);
app.set('view engine', 'ejs');
app.use(function(req, res, next) { next(); });
io.on('connection', function(socket){ console.log('a user connected'); });
app.use('/', require('./routes/test.js'));
const PORT = process.env.PORT || 8081;

// 启动绑定Socket.io的HTTP服务器
http.listen(PORT, console.log(`Server started on port ${PORT}`));

// 最后导出router
module.exports = router;

验证修复效果

重启服务器后访问页面,浏览器应该能正常加载/socket.io/socket.io.js,控制台的404和io is not defined错误会消失,同时服务端控制台会在用户连接时输出a user connected的日志。


内容的提问来源于stack exchange,提问作者ingo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:26:00