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

Node.js聊天应用发送消息时服务器崩溃,报trim/room属性未定义错误

问题根因分析

两个报错的触发原因可直接对应到代码逻辑漏洞:

  • 报错TypeError: Cannot read property 'trim' of undefined触发在user.js的addUser方法中,原因是调用addUser时传入的name或room参数为undefined,未做前置校验就直接调用了trim()方法。
  • 报错TypeError: Cannot read property 'room' of undefined触发在index.js的sendMessage事件回调中,原因是getUser(socket.id)没有查询到对应用户,返回了undefined,未做校验就直接访问了user.room属性。
修复方案

1. 修复user.js的参数校验逻辑

在addUser方法最前面新增参数非空校验,避免调用trim时报错:

const addUser = ({ id, name, room }) =>{
  // 新增基础非空校验
  if (!name || !room) {
    return { error: '用户名和房间名称不能为空' }
  }
  name = name.trim().toLowerCase()
  room = room.trim().toLowerCase()
  // 新增trim后非空校验,避免纯空格的无效参数
  if (!name || !room) {
    return { error: '用户名和房间名称不能为纯空格' }
  }

  const existingUser = users.find((user) => user.room === room && user.name === name)
  if(existingUser){
      return {error: '用户名已被占用'}
  }

  const user = {id, name, room}
  users.push(user);
  return{ user }
}

2. 修复index.js的sendMessage逻辑

获取用户后新增存在性校验,避免访问undefined的属性:

socket.on('sendMessage', (message, callback) => {
  var user = getUser(socket.id)
  // 新增用户校验
  if (!user) {
    return callback('请先加入房间再发送消息')
  }
  // 可选:新增消息内容校验,避免发送空消息
  if (!message?.trim()) {
    return callback('消息内容不能为空')
  }

  io.to(user.room).emit('message', { user: user.name, text: message })
  callback()
})

3. 补全disconnect事件的用户移除逻辑

原代码中用户断开连接后没有清理用户列表,会导致无效用户残留,同时也能避免后续查询到不存在的用户:

socket.on('disconnect', () => {
  console.log('Aw they left :(');
  const removedUser = removeUser(socket.id)
  // 用户存在的话给房间发离开通知
  if (removedUser) {
    io.to(removedUser.room).emit('message', { user: 'admin', text: `${removedUser.name} 已离开房间` })
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:30:05