const WebSocket = require('ws'); // 测试配置 const config = { wsUrl: 'ws://localhost:3003', managerCredentials: { managerId: 22, // 使用数字格式的客服ID userType: 'manager' }, testTimeout: 10000, // 10秒超时 messageTimeout: 5000 // 5秒消息等待超时 }; // 简化的测试函数 async function testConversationListFormat() { console.log('开始测试客服会话列表查询(正确消息格式)'); console.log(`连接到WebSocket服务器: ${config.wsUrl}`); return new Promise((resolve, reject) => { let ws; let connected = false; let authenticated = false; let listMessageSent = false; // 超时处理 const timeoutId = setTimeout(() => { console.error('测试超时!'); if (ws && connected) { ws.close(); } reject(new Error('测试超时:未在规定时间内完成所有操作')); }, config.testTimeout); try { // 创建WebSocket连接 ws = new WebSocket(config.wsUrl); // 连接打开事件 ws.on('open', () => { console.log('✓ WebSocket连接已建立'); connected = true; // 发送认证请求 const authData = { type: 'auth', managerId: config.managerCredentials.managerId, userType: config.managerCredentials.userType }; console.log(`发送客服认证请求:`, authData); ws.send(JSON.stringify(authData)); }); // 接收消息事件 ws.on('message', (data) => { try { const messageStr = data.toString('utf8'); console.log('收到原始消息数据:', messageStr); const message = JSON.parse(messageStr); console.log('解析后的消息:', message); // 处理认证响应 if (message.type === 'auth_success') { console.log('✓ 客服认证成功'); authenticated = true; // 只使用'list'操作格式查询会话列表 setTimeout(() => { if (!listMessageSent) { listMessageSent = true; const listRequest = { action: 'list' }; console.log(`发送会话列表查询请求 (action: 'list'):`, listRequest); ws.send(JSON.stringify(listRequest)); // 为'list'请求设置专用超时 setTimeout(() => { console.log('未收到会话列表响应,尝试直接发送消息类型为"get_conversations"的请求'); const directRequest = { type: 'get_conversations' }; console.log(`发送直接请求 (type: 'get_conversations'):`, directRequest); ws.send(JSON.stringify(directRequest)); }, config.messageTimeout); } }, 1000); } else if (message.type === 'session_list' && message.data) { // 处理'list'操作的响应 console.log('✓ 收到会话列表响应 (session_list格式)'); console.log(`会话列表包含 ${message.data.length} 个会话`); // 清理并完成测试 clearTimeout(timeoutId); setTimeout(() => { ws.close(); resolve({ success: true, responseType: 'session_list', data: message.data }); }, 1000); } else if (message.type === 'conversations_list' && message.payload && message.payload.conversations) { // 处理'get_conversations'操作的响应 console.log('✓ 收到会话列表响应 (conversations_list格式)'); console.log(`会话列表包含 ${message.payload.conversations.length} 个会话`); // 清理并完成测试 clearTimeout(timeoutId); setTimeout(() => { ws.close(); resolve({ success: true, responseType: 'conversations_list', data: message.payload.conversations }); }, 1000); } else if (message.type === 'heartbeat') { // 记录心跳消息 console.log('收到心跳消息'); } else if (message.type === 'error') { // 处理错误 console.error('✗ 收到错误消息:', message.message); } else { console.log('收到未预期的消息类型:', message.type); } } catch (parseError) { console.error('解析消息失败:', parseError); console.log('原始消息数据:', data.toString('utf8')); } }); // 错误事件处理 ws.on('error', (error) => { console.error('WebSocket错误:', error); }); // 连接关闭事件 ws.on('close', (code, reason) => { console.log(`WebSocket连接已关闭: 代码=${code}, 原因=${reason}`); clearTimeout(timeoutId); // 即使连接关闭,也尝试完成测试 resolve({ success: false, message: '连接已关闭但未收到会话列表' }); }); } catch (error) { console.error('测试初始化失败:', error); clearTimeout(timeoutId); reject(error); } }); } // 运行测试 testConversationListFormat() .then(result => { console.log('\n=== 测试结果 ==='); if (result.success) { console.log('测试成功!'); console.log(`响应类型: ${result.responseType}`); console.log(`获取到 ${result.data.length} 个会话`); if (result.data.length > 0) { console.log('=== 会话详情(前3个)==='); result.data.slice(0, 3).forEach((conv, index) => { console.log(`\n会话 ${index + 1}:`); console.log(` 会话ID: ${conv.conversation_id || '未知'}`); console.log(` 用户ID: ${conv.user_id || '未知'}`); console.log(` 客服ID: ${conv.manager_id || '未知'}`); console.log(` 最后消息: ${conv.last_message || '无'}`); console.log(` 未读计数: ${conv.unread_count || '未知'}`); console.log(` 用户在线: ${conv.user_online ? '是' : '否'}`); console.log(` 客服在线: ${conv.cs_online ? '是' : '否'}`); }); } } else { console.log('测试未完全成功,但完成了连接和认证'); console.log('消息:', result.message); } }) .catch(error => { console.error('\n=== 测试执行失败 ==='); console.error('错误:', error.message); }) .finally(() => { console.log('\n测试完成!'); });