Files
jiebanke/backend/scripts/test-database-connection-fixed.js

204 lines
6.8 KiB
JavaScript
Raw Normal View History

#!/usr/bin/env node
/**
* 数据库连接测试脚本 - 修复版
* 用于验证MySQL数据库连接配置的正确性
*/
const mysql = require('mysql2/promise');
const config = require('../config/env');
async function testDatabaseConnection() {
let connection;
try {
console.log('🚀 开始数据库连接测试...');
console.log(`📊 环境: ${process.env.NODE_ENV || 'development'}`);
// 使用env.js中的mysql配置
const dbConfig = {
host: config.mysql.host,
port: config.mysql.port,
user: config.mysql.user,
password: config.mysql.password,
database: config.mysql.database,
charset: config.mysql.charset,
timezone: config.mysql.timezone
};
console.log(`🔗 连接信息: ${dbConfig.host}:${dbConfig.port}/${dbConfig.database}`);
console.log('='.repeat(50));
// 测试连接
console.log('🔍 测试数据库连接...');
connection = await mysql.createConnection(dbConfig);
console.log('✅ 数据库连接成功');
// 测试查询
console.log('🔍 测试基本查询...');
const [rows] = await connection.execute('SELECT 1 + 1 AS result, NOW() as current_time');
console.log(`✅ 查询测试成功: ${rows[0].result}, 服务器时间: ${rows[0].current_time}`);
// 检查数据库版本
console.log('🔍 检查数据库版本...');
const [versionRows] = await connection.execute('SELECT VERSION() as version');
console.log(`📊 MySQL版本: ${versionRows[0].version}`);
// 检查数据库字符集
console.log('🔍 检查数据库字符集...');
const [charsetRows] = await connection.execute(
'SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = ?',
[dbConfig.database]
);
if (charsetRows.length > 0) {
console.log(`📝 数据库字符集: ${charsetRows[0].DEFAULT_CHARACTER_SET_NAME}`);
console.log(`📝 数据库排序规则: ${charsetRows[0].DEFAULT_COLLATION_NAME}`);
}
// 检查表结构
console.log('🔍 检查核心表结构...');
const tablesToCheck = [
'admins', 'users', 'merchants', 'orders', 'payments',
'animals', 'animal_claims', 'travel_plans', 'travel_registrations',
'flowers', 'flower_orders'
];
const existingTables = [];
const missingTables = [];
for (const table of tablesToCheck) {
try {
const [tableInfo] = await connection.execute(
`SELECT COUNT(*) as count FROM information_schema.tables
WHERE table_schema = ? AND table_name = ?`,
[dbConfig.database, table]
);
if (tableInfo[0].count > 0) {
console.log(`✅ 表存在: ${table}`);
existingTables.push(table);
// 检查表记录数
const [countRows] = await connection.execute(`SELECT COUNT(*) as count FROM ${table}`);
console.log(` 📊 记录数: ${countRows[0].count}`);
} else {
console.log(`⚠️ 表不存在: ${table}`);
missingTables.push(table);
}
} catch (error) {
console.log(`❌ 检查表失败: ${table} - ${error.message}`);
missingTables.push(table);
}
}
// 检查管理员表数据
if (existingTables.includes('admins')) {
console.log('🔍 检查管理员数据...');
try {
const [adminCount] = await connection.execute('SELECT COUNT(*) as count FROM admins');
console.log(`📊 管理员记录数: ${adminCount[0].count}`);
if (adminCount[0].count > 0) {
const [admins] = await connection.execute('SELECT username, role, status FROM admins LIMIT 5');
console.log('👥 管理员样例:');
admins.forEach(admin => {
console.log(` - ${admin.username} (${admin.role}, 状态: ${admin.status})`);
});
}
} catch (error) {
console.log('❌ 检查管理员数据失败:', error.message);
}
}
// 检查用户表数据
if (existingTables.includes('users')) {
console.log('🔍 检查用户数据...');
try {
const [userCount] = await connection.execute('SELECT COUNT(*) as count FROM users');
console.log(`📊 用户记录数: ${userCount[0].count}`);
if (userCount[0].count > 0) {
const [users] = await connection.execute('SELECT username, user_type, status FROM users LIMIT 5');
console.log('👤 用户样例:');
users.forEach(user => {
console.log(` - ${user.username} (${user.user_type || '未知'}, 状态: ${user.status})`);
});
}
} catch (error) {
console.log('❌ 检查用户数据失败:', error.message);
}
}
// 检查连接池配置
console.log('🔍 检查连接配置...');
console.log(`📈 连接池限制: ${config.mysql.connectionLimit || 10}`);
console.log(`🔤 字符集: ${config.mysql.charset}`);
console.log(`⏰ 时区: ${config.mysql.timezone}`);
console.log('\n📋 数据库状态总结:');
console.log(`✅ 存在的表: ${existingTables.length}/${tablesToCheck.length}`);
if (missingTables.length > 0) {
console.log(`⚠️ 缺失的表: ${missingTables.join(', ')}`);
console.log('💡 建议运行数据库迁移脚本创建缺失的表');
}
console.log('\n🎉 数据库连接测试完成!');
console.log('✅ 数据库连接正常');
return {
success: true,
existingTables,
missingTables,
dbConfig: {
host: dbConfig.host,
port: dbConfig.port,
database: dbConfig.database,
user: dbConfig.user
}
};
} catch (error) {
console.error('❌ 数据库连接测试失败:', error.message);
console.error('💡 可能的原因:');
console.error(' - 数据库服务未启动');
console.error(' - 连接配置错误');
console.error(' - 网络连接问题');
console.error(' - 数据库权限不足');
console.error(' - 防火墙限制');
console.error(' - IP地址未授权');
if (error.code) {
console.error(`🔍 错误代码: ${error.code}`);
}
console.error('🔍 连接详情:', {
host: config.mysql.host,
port: config.mysql.port,
user: config.mysql.user,
database: config.mysql.database
});
return {
success: false,
error: error.message,
code: error.code
};
} finally {
if (connection) {
await connection.end();
console.log('🔒 数据库连接已关闭');
}
}
}
// 如果是直接运行此文件,则执行测试
if (require.main === module) {
testDatabaseConnection()
.then((result) => {
process.exit(result.success ? 0 : 1);
})
.catch(() => process.exit(1));
}
module.exports = { testDatabaseConnection };