Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Pangea-Agent
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Gavin-Group
Pangea-Agent
Commits
4eed88c9
Commit
4eed88c9
authored
Dec 17, 2025
by
ligaowei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修复WebSocket消息处理中的类型错误问题:rawData.trim is not a function
parent
19aa1f99
Changes
2
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
400 additions
and
0 deletions
+400
-0
WEBSOCKET_MESSAGE_PROCESSING_FIX.md
WEBSOCKET_MESSAGE_PROCESSING_FIX.md
+89
-0
websocketService.ts
frontend/src/services/websocketService.ts
+311
-0
No files found.
WEBSOCKET_MESSAGE_PROCESSING_FIX.md
0 → 100644
View file @
4eed88c9
# 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
frontend/src/services/websocketService.ts
0 → 100644
View file @
4eed88c9
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment