Commit 4eed88c9 authored by ligaowei's avatar ligaowei

修复WebSocket消息处理中的类型错误问题:rawData.trim is not a function

parent 19aa1f99
# WebSocket消息处理修复说明
## 问题描述
在前端WebSocket服务中,处理文本消息时出现了"rawData.trim is not a function"的错误。错误发生在以下代码段:
```typescript
const rawData = event.data as string;
// ...
if (!rawData || rawData.trim().length === 0) {
// ...
}
```
## 问题原因
1. **类型假设错误**:代码假设`event.data`总是字符串类型,但实际上WebSocket消息可以是多种类型:
- `string`(文本消息)
- `ArrayBuffer`(二进制消息)
- `Blob`(二进制大对象)
2. **类型转换不当**:直接使用`as string`进行类型断言,而不是进行类型检查和适当转换。
3. **方法调用错误**:当`event.data`实际上是`ArrayBuffer`或其他非字符串类型时,调用`.trim()`方法会导致运行时错误。
## 解决方案
修改WebSocket消息处理逻辑,增加类型检查和适当的类型转换:
```typescript
// 文本消息处理(兼容旧协议或错误消息)
const rawData = event.data;
// 确保rawData是字符串类型
let rawString: string;
if (typeof rawData === 'string') {
rawString = rawData;
} else {
// 如果不是字符串,尝试转换为字符串
rawString = String(rawData);
}
const dataLength = rawString ? rawString.length : 0;
addLog(`接收到文本消息,长度: ${dataLength} 字符(已弃用,应使用二进制协议)`, 'debug');
if (!rawString || rawString.trim().length === 0) {
addLog('接收到空的WebSocket消息,跳过处理', 'warn');
return;
}
// 尝试解析为JSON(仅用于兼容旧数据)
try {
const parsedData = JSON.parse(rawString);
addLog('文本消息JSON解析成功,数据类型: ' + parsedData.type, 'info');
if (this.options.onMessage) {
this.options.onMessage(parsedData);
}
} catch (parseError) {
const errorMsg = (parseError as Error).message;
addLog('文本消息JSON解析失败: ' + errorMsg + '(建议检查是否应使用二进制协议)', 'warn');
}
```
## 修复要点
1. **类型安全检查**:使用`typeof rawData === 'string'`检查实际类型
2. **安全类型转换**:对于非字符串类型,使用`String(rawData)`进行转换
3. **保持功能一致**:确保修复后的行为与原逻辑一致
4. **增强健壮性**:避免因类型不匹配导致的运行时错误
## 测试验证
修复后应验证以下场景:
1. 正常文本消息处理
2. 空消息处理
3. 二进制消息处理(应走二进制分支)
4. 其他类型消息的安全处理
## 相关文件
- `frontend/src/services/websocketService.ts`:主要修复文件
- `frontend/src/services/binaryMessageHandler.ts`:二进制消息处理相关文件
## 后续建议
1. 强化类型检查,在处理WebSocket消息时明确区分文本和二进制消息
2. 增加更详细的日志记录,便于调试不同类型的WebSocket消息
3. 考虑逐步淘汰文本协议,全面转向更高效的二进制协议
\ No newline at end of file
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment