2 changed files with 419 additions and 49 deletions
@ -0,0 +1,284 @@ |
|||
const WebSocket = require('ws'); |
|||
const readline = require('readline'); |
|||
const mysql = require('mysql2/promise'); |
|||
|
|||
// 数据库连接配置
|
|||
const dbConfig = { |
|||
host: 'localhost', |
|||
user: 'root', |
|||
password: '123456', |
|||
database: 'wechat_app' |
|||
}; |
|||
|
|||
// 测试配置
|
|||
const TEST_CONFIG = { |
|||
wsUrl: 'ws://localhost:3003', |
|||
testUserId: 'test_user_' + Date.now(), |
|||
testManagerId: '22', |
|||
testMessage: '这是一条测试消息 ' + Date.now() |
|||
}; |
|||
|
|||
// 创建命令行交互界面
|
|||
const rl = readline.createInterface({ |
|||
input: process.stdin, |
|||
output: process.stdout |
|||
}); |
|||
|
|||
// WebSocket测试客户端
|
|||
class WebSocketTestClient { |
|||
constructor() { |
|||
this.ws = null; |
|||
this.authenticated = false; |
|||
this.messages = []; |
|||
this.connectionAttempts = 0; |
|||
this.maxAttempts = 3; |
|||
} |
|||
|
|||
connect(serverUrl = TEST_CONFIG.wsUrl) { |
|||
console.log(`正在连接到服务器: ${serverUrl}`); |
|||
this.connectionAttempts++; |
|||
|
|||
this.ws = new WebSocket(serverUrl); |
|||
|
|||
this.ws.on('open', () => { |
|||
console.log('✅ WebSocket连接已建立'); |
|||
this.connectionAttempts = 0; // 重置连接尝试次数
|
|||
this.authenticate(); |
|||
}); |
|||
|
|||
this.ws.on('message', (data) => { |
|||
try { |
|||
const message = JSON.parse(data.toString()); |
|||
console.log('📨 收到消息:', JSON.stringify(message, null, 2)); |
|||
this.handleMessage(message); |
|||
} catch (error) { |
|||
console.error('❌ 解析消息失败:', error); |
|||
} |
|||
}); |
|||
|
|||
this.ws.on('error', (error) => { |
|||
console.error('❌ WebSocket错误:', error.message); |
|||
}); |
|||
|
|||
this.ws.on('close', (code, reason) => { |
|||
console.log(`🔌 WebSocket连接已关闭: ${code} - ${reason}`); |
|||
this.authenticated = false; |
|||
|
|||
// 如果不是主动关闭,尝试重连
|
|||
if (this.connectionAttempts < this.maxAttempts) { |
|||
console.log(`尝试重连 (${this.connectionAttempts}/${this.maxAttempts})...`); |
|||
setTimeout(() => this.connect(serverUrl), 2000); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
authenticate() { |
|||
console.log('正在发送认证信息...'); |
|||
const authMessage = { |
|||
type: 'auth', |
|||
userId: TEST_CONFIG.testUserId, |
|||
userType: 'user', |
|||
timestamp: Date.now() |
|||
}; |
|||
|
|||
console.log('🔑 发送认证请求:', JSON.stringify(authMessage)); |
|||
this.sendMessage(authMessage); |
|||
} |
|||
|
|||
handleMessage(message) { |
|||
// 存储接收到的消息
|
|||
this.messages.push(message); |
|||
|
|||
if (message.type === 'auth_success') { |
|||
console.log('✅ 认证成功!'); |
|||
this.authenticated = true; |
|||
this.sendTestMessage(); |
|||
} else if (message.type === 'auth_error') { |
|||
console.error('❌ 认证失败:', message.message); |
|||
} else if (message.type === 'message_sent') { |
|||
console.log('✅ 消息发送成功确认:', message.payload); |
|||
console.log('消息ID:', message.payload.messageId); |
|||
console.log('会话ID:', message.payload.conversationId); |
|||
} else if (message.type === 'new_message') { |
|||
console.log('📥 收到新消息:', message.payload); |
|||
this.messages.push(message.payload); |
|||
} else if (message.type === 'error') { |
|||
console.error('❌ 收到错误消息:', message.message); |
|||
} |
|||
} |
|||
|
|||
// 数据库查询函数
|
|||
async queryDatabase() { |
|||
let connection = null; |
|||
try { |
|||
console.log('\n🔍 查询数据库验证消息存储...'); |
|||
connection = await mysql.createConnection(dbConfig); |
|||
|
|||
// 查询最新消息
|
|||
const [messages] = await connection.execute( |
|||
`SELECT * FROM chat_messages
|
|||
ORDER BY created_at DESC |
|||
LIMIT 5` |
|||
); |
|||
|
|||
if (messages.length > 0) { |
|||
console.log(`\n📊 找到 ${messages.length} 条最新消息:`); |
|||
let testMessageFound = false; |
|||
|
|||
messages.forEach((msg, index) => { |
|||
console.log(`\n--- 消息 ${index + 1} ---`); |
|||
console.log(`消息ID: ${msg.message_id}`); |
|||
console.log(`会话ID: ${msg.conversation_id}`); |
|||
console.log(`发送者ID: ${msg.sender_id}`); |
|||
console.log(`内容: ${msg.content}`); |
|||
|
|||
if (msg.content === TEST_CONFIG.testMessage) { |
|||
console.log('✅ 测试消息已成功存储到数据库!'); |
|||
testMessageFound = true; |
|||
} |
|||
}); |
|||
|
|||
if (!testMessageFound) { |
|||
console.log('\n⚠️ 未找到测试消息'); |
|||
} |
|||
} else { |
|||
console.log('\n❌ 未找到任何消息记录'); |
|||
} |
|||
|
|||
// 查询最新会话
|
|||
const [conversations] = await connection.execute( |
|||
`SELECT * FROM chat_conversations
|
|||
ORDER BY created_at DESC |
|||
LIMIT 5` |
|||
); |
|||
|
|||
if (conversations.length > 0) { |
|||
console.log(`\n📋 找到 ${conversations.length} 条最新会话:`); |
|||
conversations.forEach((conv, index) => { |
|||
console.log(`\n--- 会话 ${index + 1} ---`); |
|||
console.log(`会话ID: ${conv.conversation_id}`); |
|||
console.log(`用户ID: ${conv.userId}`); |
|||
console.log(`客服ID: ${conv.managerId}`); |
|||
}); |
|||
} |
|||
|
|||
} catch (error) { |
|||
console.error('\n❌ 数据库查询失败:', error.message); |
|||
} finally { |
|||
if (connection) { |
|||
await connection.end(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
sendTestMessage() { |
|||
// 生成临时会话ID(前端格式: temp_[currentUserId]_[targetId]_[timestamp])
|
|||
const timestamp = Date.now(); |
|||
const tempConversationId = `temp_${TEST_CONFIG.testUserId}_${TEST_CONFIG.testManagerId}_${timestamp}`; |
|||
|
|||
console.log(`📝 生成的临时会话ID: ${tempConversationId}`); |
|||
|
|||
const testMessage = { |
|||
type: 'chat_message', |
|||
conversationId: tempConversationId, |
|||
receiverId: TEST_CONFIG.testManagerId, |
|||
senderId: TEST_CONFIG.testUserId, |
|||
senderType: 1, |
|||
content: TEST_CONFIG.testMessage, |
|||
contentType: 1, |
|||
messageId: 'test_msg_' + Date.now(), |
|||
timestamp: Date.now() |
|||
}; |
|||
|
|||
console.log('📤 发送测试消息:', JSON.stringify(testMessage)); |
|||
this.sendMessage(testMessage); |
|||
|
|||
// 发送后自动查询数据库验证
|
|||
setTimeout(() => { |
|||
this.queryDatabase().catch(console.error); |
|||
}, 2000); |
|||
} |
|||
|
|||
testDatabaseStorage() { |
|||
console.log('\n======================================='); |
|||
console.log('📊 测试数据库存储功能'); |
|||
console.log('将自动查询数据库验证消息存储'); |
|||
console.log('=======================================\n'); |
|||
|
|||
// 自动查询数据库
|
|||
this.queryDatabase().catch(console.error); |
|||
|
|||
// 询问用户是否要发送更多消息
|
|||
this.promptForMoreMessages(); |
|||
} |
|||
|
|||
promptForMoreMessages() { |
|||
rl.question('是否发送另一条测试消息?(y/n): ', (answer) => { |
|||
if (answer.toLowerCase() === 'y') { |
|||
this.sendTestMessage(); |
|||
} else { |
|||
console.log('\n测试完成!按Ctrl+C退出。'); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
sendMessage(message) { |
|||
if (this.ws && this.ws.readyState === WebSocket.OPEN) { |
|||
this.ws.send(JSON.stringify(message)); |
|||
} else { |
|||
console.error('❌ WebSocket未连接,无法发送消息'); |
|||
} |
|||
} |
|||
|
|||
close() { |
|||
if (this.ws) { |
|||
this.ws.close(); |
|||
} |
|||
rl.close(); |
|||
} |
|||
} |
|||
|
|||
// 自动测试函数
|
|||
async function autoTest() { |
|||
console.log('\n========================================'); |
|||
console.log('开始自动测试消息存储功能'); |
|||
console.log('========================================\n'); |
|||
|
|||
const client = new WebSocketTestClient(); |
|||
|
|||
// 重写handleMessage以支持自动测试
|
|||
const originalHandleMessage = client.handleMessage.bind(client); |
|||
client.handleMessage = function(message) { |
|||
originalHandleMessage(message); |
|||
|
|||
if (message.type === 'message_sent') { |
|||
// 消息发送成功后查询数据库
|
|||
setTimeout(() => { |
|||
client.queryDatabase().then(() => { |
|||
console.log('\n========================================'); |
|||
console.log('自动测试完成'); |
|||
console.log('========================================'); |
|||
process.exit(0); |
|||
}); |
|||
}, 2000); |
|||
} |
|||
}; |
|||
|
|||
client.connect(); |
|||
} |
|||
|
|||
// 启动测试客户端
|
|||
console.log('======================================='); |
|||
console.log('🚀 消息存储测试工具'); |
|||
console.log('这个工具将测试WebSocket连接、认证和消息存储功能'); |
|||
console.log('=======================================\n'); |
|||
|
|||
// 自动模式运行
|
|||
console.log('🎯 以自动测试模式运行...'); |
|||
autoTest(); |
|||
|
|||
// 处理进程终止
|
|||
process.on('SIGINT', () => { |
|||
console.log('\n正在关闭连接...'); |
|||
process.exit(0); |
|||
}); |
|||
Loading…
Reference in new issue