发送首条消息后Socket连接断开,Node.js服务器报错崩溃
解决Socket.IO客户端发送消息导致服务端崩溃的问题
问题根源
服务端的sendMessage事件监听函数定义了第二个参数callback,但客户端调用socket.emit('sendMessage', message)时仅传递了消息内容,未提供回调函数。当服务端执行callback()时,因callback不是函数类型触发TypeError,直接导致服务端崩溃。
解决方案
方案1:客户端补充传递回调函数
修改Angular客户端的sendMessage方法,添加回调参数:
public sendMessage(message: any) { this.socket.emit('sendMessage', message, () => { // 可选:添加消息发送确认逻辑 console.log('消息已送达服务端'); }); }
方案2:服务端兼容无回调的场景
修改Node.js服务端的sendMessage监听逻辑,先判断callback是否为函数再执行:
socket.on('sendMessage', (message, callback) => { const user = getUser(socket.id); io.to(user.room).emit('message', { user: user.name, text: message }); io.to(user.room).emit('roomData', { room: user.room, users: getUsersInRoom(user.room) }); // 仅当callback是函数时调用,避免类型错误 typeof callback === 'function' && callback(); })
额外注意事项
服务端中getUser(socket.id)依赖用户已通过join事件完成注册,否则user会为undefined,后续访问user.room会引发新的错误。建议客户端建立连接后先执行房间加入操作:
setupSocketConnection() { this.socket = io(SOCKET_ENDPOINT); // 连接成功后加入目标房间,参数可根据业务调整 this.socket.emit('join', { name: '你的用户名', room: '目标房间名' }, (error?: string) => { if (error) { console.error('加入房间失败:', error); } }); }
内容的提问来源于stack exchange,提问作者rocks1287
相关产品推荐
相关产品推荐

