Initial Commit
This commit is contained in:
commit
1d71a02738
237 changed files with 64293 additions and 0 deletions
375
utils/websocket-diagnostic.js
Normal file
375
utils/websocket-diagnostic.js
Normal file
|
|
@ -0,0 +1,375 @@
|
|||
// WebSocket连接诊断工具
|
||||
class WebSocketDiagnostic {
|
||||
constructor() {
|
||||
this.testResults = [];
|
||||
}
|
||||
|
||||
// 🔥 ===== 全面诊断WebSocket连接问题 =====
|
||||
|
||||
async runFullDiagnostic() {
|
||||
console.log('🔍 开始WebSocket连接全面诊断...');
|
||||
this.testResults = [];
|
||||
|
||||
// 1. 检查基础环境
|
||||
await this.checkEnvironment();
|
||||
|
||||
// 2. 检查认证信息
|
||||
await this.checkAuthentication();
|
||||
|
||||
// 3. 测试网络连接
|
||||
await this.testNetworkConnectivity();
|
||||
|
||||
// 4. 测试WebSocket连接
|
||||
await this.testWebSocketConnection();
|
||||
|
||||
// 5. 生成诊断报告
|
||||
this.generateReport();
|
||||
|
||||
return this.testResults;
|
||||
}
|
||||
|
||||
// 检查基础环境
|
||||
async checkEnvironment() {
|
||||
console.log('📱 检查小程序环境...');
|
||||
|
||||
try {
|
||||
// 使用新的API替代已弃用的wx.getSystemInfoSync
|
||||
const deviceInfo = wx.getDeviceInfo();
|
||||
const appBaseInfo = wx.getAppBaseInfo();
|
||||
const accountInfo = wx.getAccountInfoSync();
|
||||
|
||||
const envInfo = {
|
||||
platform: deviceInfo.platform,
|
||||
version: appBaseInfo.version,
|
||||
SDKVersion: appBaseInfo.SDKVersion,
|
||||
appId: accountInfo.miniProgram.appId,
|
||||
envVersion: accountInfo.miniProgram.envVersion
|
||||
};
|
||||
|
||||
console.log('📱 环境信息:', envInfo);
|
||||
|
||||
this.testResults.push({
|
||||
test: '环境检查',
|
||||
status: 'success',
|
||||
data: envInfo
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 环境检查失败:', error);
|
||||
this.testResults.push({
|
||||
test: '环境检查',
|
||||
status: 'error',
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 检查认证信息
|
||||
async checkAuthentication() {
|
||||
console.log('🔑 检查认证信息...');
|
||||
|
||||
try {
|
||||
// 获取token
|
||||
const userInfo = wx.getStorageSync('userInfo');
|
||||
const directToken = wx.getStorageSync('token');
|
||||
const app = getApp();
|
||||
const appToken = app?.globalData?.userInfo?.token;
|
||||
|
||||
const authInfo = {
|
||||
hasUserInfo: !!userInfo,
|
||||
hasUserInfoToken: !!(userInfo?.token),
|
||||
hasDirectToken: !!directToken,
|
||||
hasAppToken: !!appToken,
|
||||
userInfoTokenLength: userInfo?.token?.length || 0,
|
||||
directTokenLength: directToken?.length || 0,
|
||||
appTokenLength: appToken?.length || 0
|
||||
};
|
||||
|
||||
console.log('🔑 认证信息:', authInfo);
|
||||
|
||||
// 检查token格式
|
||||
const token = userInfo?.token || directToken || appToken;
|
||||
if (token) {
|
||||
authInfo.tokenPrefix = token.substring(0, 20) + '...';
|
||||
authInfo.isJWT = token.startsWith('eyJ');
|
||||
authInfo.tokenParts = token.split('.').length;
|
||||
}
|
||||
|
||||
this.testResults.push({
|
||||
test: '认证检查',
|
||||
status: token ? 'success' : 'error',
|
||||
data: authInfo,
|
||||
error: token ? null : '未找到有效的认证token'
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 认证检查失败:', error);
|
||||
this.testResults.push({
|
||||
test: '认证检查',
|
||||
status: 'error',
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 测试网络连接
|
||||
async testNetworkConnectivity() {
|
||||
console.log('🌐 测试网络连接...');
|
||||
|
||||
try {
|
||||
// 检查网络状态
|
||||
const networkInfo = await this.getNetworkType();
|
||||
console.log('🌐 网络状态:', networkInfo);
|
||||
|
||||
// 测试HTTP连接
|
||||
const httpTest = await this.testHttpConnection();
|
||||
|
||||
this.testResults.push({
|
||||
test: '网络连接',
|
||||
status: 'success',
|
||||
data: {
|
||||
network: networkInfo,
|
||||
httpTest: httpTest
|
||||
}
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 网络连接测试失败:', error);
|
||||
this.testResults.push({
|
||||
test: '网络连接',
|
||||
status: 'error',
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 测试WebSocket连接
|
||||
async testWebSocketConnection() {
|
||||
console.log('🔌 测试WebSocket连接...');
|
||||
|
||||
const testUrls = [
|
||||
'wss://api.faxianwo.me/api/v1/ws',
|
||||
'wss://api.faxianwo.me',
|
||||
'wss://api.faxianwo.me/ws'
|
||||
];
|
||||
|
||||
const results = [];
|
||||
|
||||
for (const url of testUrls) {
|
||||
console.log(`🔗 测试URL: ${url}`);
|
||||
|
||||
try {
|
||||
const result = await this.testSingleWebSocketUrl(url);
|
||||
results.push({
|
||||
url: url,
|
||||
status: result.success ? 'success' : 'error',
|
||||
...result
|
||||
});
|
||||
} catch (error) {
|
||||
results.push({
|
||||
url: url,
|
||||
status: 'error',
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
this.testResults.push({
|
||||
test: 'WebSocket连接',
|
||||
status: results.some(r => r.status === 'success') ? 'success' : 'error',
|
||||
data: results
|
||||
});
|
||||
}
|
||||
|
||||
// 测试单个WebSocket URL
|
||||
testSingleWebSocketUrl(url) {
|
||||
return new Promise((resolve) => {
|
||||
const startTime = Date.now();
|
||||
let resolved = false;
|
||||
|
||||
const timeout = setTimeout(() => {
|
||||
if (!resolved) {
|
||||
resolved = true;
|
||||
resolve({
|
||||
success: false,
|
||||
error: '连接超时',
|
||||
duration: Date.now() - startTime
|
||||
});
|
||||
}
|
||||
}, 10000);
|
||||
|
||||
try {
|
||||
// 获取token
|
||||
const userInfo = wx.getStorageSync('userInfo');
|
||||
const token = userInfo?.token;
|
||||
|
||||
const testWs = wx.connectSocket({
|
||||
url: `${url}?device_id=diagnostic_${Date.now()}`,
|
||||
header: token ? {
|
||||
'Authorization': `Bearer ${token}`
|
||||
} : {},
|
||||
timeout: 8000
|
||||
});
|
||||
|
||||
testWs.onOpen((res) => {
|
||||
if (!resolved) {
|
||||
resolved = true;
|
||||
clearTimeout(timeout);
|
||||
testWs.close();
|
||||
resolve({
|
||||
success: true,
|
||||
duration: Date.now() - startTime,
|
||||
response: res
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
testWs.onError((error) => {
|
||||
if (!resolved) {
|
||||
resolved = true;
|
||||
clearTimeout(timeout);
|
||||
resolve({
|
||||
success: false,
|
||||
error: error.errMsg || 'WebSocket连接错误',
|
||||
duration: Date.now() - startTime,
|
||||
errorDetail: error
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
testWs.onClose((res) => {
|
||||
if (!resolved) {
|
||||
resolved = true;
|
||||
clearTimeout(timeout);
|
||||
resolve({
|
||||
success: false,
|
||||
error: '连接被关闭',
|
||||
duration: Date.now() - startTime,
|
||||
closeDetail: res
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
if (!resolved) {
|
||||
resolved = true;
|
||||
clearTimeout(timeout);
|
||||
resolve({
|
||||
success: false,
|
||||
error: error.message,
|
||||
duration: Date.now() - startTime
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 获取网络类型
|
||||
getNetworkType() {
|
||||
return new Promise((resolve, reject) => {
|
||||
wx.getNetworkType({
|
||||
success: resolve,
|
||||
fail: reject
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 测试HTTP连接
|
||||
testHttpConnection() {
|
||||
return new Promise((resolve) => {
|
||||
wx.request({
|
||||
url: 'https://api.faxianwo.me/api/v1/health',
|
||||
method: 'GET',
|
||||
timeout: 5000,
|
||||
success: (res) => {
|
||||
resolve({
|
||||
success: true,
|
||||
statusCode: res.statusCode,
|
||||
data: res.data
|
||||
});
|
||||
},
|
||||
fail: (error) => {
|
||||
resolve({
|
||||
success: false,
|
||||
error: error.errMsg
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 生成诊断报告
|
||||
generateReport() {
|
||||
console.log('📋 生成诊断报告...');
|
||||
console.log('='.repeat(50));
|
||||
console.log('🔍 WebSocket连接诊断报告');
|
||||
console.log('='.repeat(50));
|
||||
|
||||
this.testResults.forEach((result, index) => {
|
||||
const status = result.status === 'success' ? '✅' : '❌';
|
||||
console.log(`${index + 1}. ${status} ${result.test}`);
|
||||
|
||||
if (result.status === 'error') {
|
||||
console.log(` 错误: ${result.error}`);
|
||||
}
|
||||
|
||||
if (result.data) {
|
||||
console.log(` 数据:`, result.data);
|
||||
|
||||
// 🔥 特别显示WebSocket连接的详细结果
|
||||
if (result.test === 'WebSocket连接' && Array.isArray(result.data)) {
|
||||
result.data.forEach((wsResult, i) => {
|
||||
const wsStatus = wsResult.status === 'success' ? '✅' : '❌';
|
||||
console.log(` ${wsStatus} ${wsResult.url}`);
|
||||
if (wsResult.status === 'success') {
|
||||
console.log(` 连接时间: ${wsResult.duration}ms`);
|
||||
} else {
|
||||
console.log(` 错误: ${wsResult.error}`);
|
||||
if (wsResult.errorDetail) {
|
||||
console.log(` 详情:`, wsResult.errorDetail);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
console.log('');
|
||||
});
|
||||
|
||||
// 生成建议
|
||||
this.generateSuggestions();
|
||||
}
|
||||
|
||||
// 生成修复建议
|
||||
generateSuggestions() {
|
||||
console.log('💡 修复建议:');
|
||||
|
||||
const authResult = this.testResults.find(r => r.test === '认证检查');
|
||||
const wsResult = this.testResults.find(r => r.test === 'WebSocket连接');
|
||||
|
||||
if (authResult?.status === 'error') {
|
||||
console.log('1. 🔑 认证问题:请确保用户已正确登录并保存了token');
|
||||
}
|
||||
|
||||
if (wsResult?.status === 'error') {
|
||||
const wsData = wsResult.data || [];
|
||||
const hasUrlError = wsData.some(r => r.error && r.error.includes('url not in domain list'));
|
||||
|
||||
if (hasUrlError) {
|
||||
console.log('2. 🌐 域名配置问题:请在微信公众平台配置WebSocket合法域名');
|
||||
console.log(' - 登录 mp.weixin.qq.com');
|
||||
console.log(' - 开发 -> 开发管理 -> 开发设置');
|
||||
console.log(' - 添加 wss://api.faxianwo.me 到WebSocket合法域名');
|
||||
} else {
|
||||
console.log('2. 🔌 WebSocket连接问题:请检查网络环境和后端服务状态');
|
||||
}
|
||||
}
|
||||
|
||||
console.log('='.repeat(50));
|
||||
}
|
||||
}
|
||||
|
||||
// 创建全局单例
|
||||
const wsdiagnostic = new WebSocketDiagnostic();
|
||||
|
||||
module.exports = wsdiagnostic;
|
||||
Loading…
Add table
Add a link
Reference in a new issue