代码逻辑无误,但Node.js Socket.IO运行时出现错误求助
Socket.IO在Node.js环境下的错误排查与修复方案
兄弟,我瞅了下你的Socket.IO代码,逻辑思路是对的,但几个细节踩坑了,这就给你捋清楚:
首先先贴出你提供的代码方便对照:
// app.js var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); app.get('/', function(req,res){ res.sendfile('index.html'); }); var clients = 0; io.on('connect', function(socket){ clients++; io.sockets.emit('boardcast', {message: clients + ' clients connected!'}); });
几个容易踩的坑(也是报错的大概率原因):
- 事件名写错了:Socket.IO服务端监听客户端连接的正确事件名是
connection,不是connect,这个是最容易导致连接异常的点! - Express方法过时:
res.sendfile是Express 3.x的旧写法,新版Express(4.x及以上)需要用res.sendFile(注意F是大写),而且最好用绝对路径避免找不到文件的问题。 - 服务器没启动监听端口:你的代码里没有启动HTTP服务器监听指定端口,客户端根本连不上服务端。
- 广播方法可以简化:
io.sockets.emit()可以直接写成io.emit(),效果是一样的,更简洁。
修正后的完整代码:
// app.js var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); const path = require('path'); // 引入path模块处理文件路径 // 用绝对路径返回index.html,避免路径问题 app.get('/', function(req, res){ res.sendFile(path.join(__dirname, 'index.html')); }); var clients = 0; // 修正事件名为connection io.on('connection', function(socket){ clients++; // 简化广播写法 io.emit('boardcast', {message: `${clients} clients connected!`}); // 别忘了监听客户端断开事件,不然客户端断开后clients计数不会减少 socket.on('disconnect', function(){ clients--; io.emit('boardcast', {message: `${clients} clients connected!`}); }); }); // 启动服务器监听3000端口 http.listen(3000, function(){ console.log('Server running on http://localhost:3000'); });
另外补充下客户端index.html里的Socket.IO连接代码(避免客户端也踩坑):
<!-- index.html --> <!DOCTYPE html> <html> <head> <title>Socket.IO Test</title> </head> <body> <div id="message"></div> <!-- 引入Socket.IO客户端脚本,这个路径是Socket.IO服务端自动提供的 --> <script src="/socket.io/socket.io.js"></script> <script> var socket = io(); socket.on('boardcast', function(data){ document.getElementById('message').innerHTML = data.message; }); </script> </body> </html>
这样修改后,基本就能解决大部分连接和事件触发的问题了,你可以试试跑起来看看效果!
内容的提问来源于stack exchange,提问作者reswe teryuio
相关产品推荐
相关产品推荐

