Files
happy-life-star/test-duplicate-message-fix.md
T
2025-07-25 17:48:02 +08:00

2.3 KiB

重复消息问题修复测试

问题描述

用户在聊天页面发送一条消息时,数据库中保存了两条相同内容的用户消息:

  1. 第一条:通过WebSocket处理器保存,包含完整的用户信息
  2. 第二条:通过REST API保存,缺少部分用户信息

根本原因

前端sendMessage方法中存在双重保存机制:

  1. WebSocket发送 - 后端WebSocket处理器会保存消息
  2. REST API调用 - 前端额外调用chatApi.createMessage保存消息

修复方案

  1. 前端修复:移除前端chat.tssendMessage方法里的chatApi.createMessage调用,只保留WebSocket发送
  2. 后端修复:创建专门的WebSocket方法sendChatMessageForWebSocket,避免重复保存用户消息

修复内容

前端修改

文件:web/src/stores/chat.ts

  • 移除了第69-82行的REST API调用
  • 添加了注释说明修复原因
  • 保留WebSocket发送逻辑

后端修改

文件:backend-single/src/main/java/com/emotion/service/AiChatService.java

  • 新增sendChatMessageForWebSocket方法接口

文件:backend-single/src/main/java/com/emotion/service/impl/AiChatServiceImpl.java

  • 实现sendChatMessageForWebSocket方法,只保存AI回复,不保存用户消息

文件:backend-single/src/main/java/com/emotion/service/WebSocketService.java

  • 修改WebSocket处理器调用新的sendChatMessageForWebSocket方法

测试步骤

  1. 启动后端服务
  2. 启动前端服务
  3. 登录用户账号
  4. 发送一条测试消息
  5. 检查数据库中是否只有一条用户消息记录

预期结果

  • 数据库中只保存一条用户消息
  • 消息包含完整的用户信息(user_id, user_type, coze_role等)
  • AI回复正常工作
  • 前端显示正常

验证SQL

-- 查看最新的消息记录
SELECT id, conversation_id, content, sender, user_id, user_type, coze_role, create_by, create_time 
FROM message 
WHERE conversation_id = '你的会话ID' 
ORDER BY create_time DESC 
LIMIT 10;

-- 检查是否还有重复消息
SELECT content, COUNT(*) as count
FROM message 
WHERE conversation_id = '你的会话ID' 
  AND sender = 'user'
  AND create_time > '2025-07-25 16:00:00'
GROUP BY content 
HAVING COUNT(*) > 1;

注意事项

  • 此修复只影响新发送的消息
  • 历史重复消息需要手动清理
  • 确保WebSocket连接正常工作