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
相关产品推荐
相关产品推荐

