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的请求,客户端也就找不到这个关键脚本了。
具体修复步骤
修正服务器启动代码:
把最后一行的app.listen(...)替换成http.listen(...),确保启动的是绑定了Socket.io的那个HTTP服务器:// 替换原来的app.listen调用 http.listen(PORT, console.log(`Server started on port ${PORT}`));调整
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
相关产品推荐
相关产品推荐

