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

发送首条消息后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:24:23