| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- const { MongoClient } = require('mongodb');
- const Redis = require('ioredis');
- const Parse = require('parse/node');
- require('dotenv').config();
- // 测试结果收集器
- const testResults = {
- mongodb: {
- status: 'pending',
- responseTime: null,
- error: null,
- details: {}
- },
- redis: {
- status: 'pending',
- responseTime: null,
- error: null,
- details: {}
- },
- parseServer: {
- status: 'pending',
- responseTime: null,
- error: null,
- details: {}
- }
- };
- // 颜色输出函数
- const colors = {
- green: '\x1b[32m',
- red: '\x1b[31m',
- yellow: '\x1b[33m',
- blue: '\x1b[34m',
- reset: '\x1b[0m'
- };
- function log(message, color = colors.reset) {
- console.log(`${color}${message}${colors.reset}`);
- }
- // 测试MongoDB连接
- async function testMongoDBConnection() {
- log('\n===== 测试MongoDB连接 =====', colors.blue);
- const startTime = Date.now();
-
- try {
- // 从环境变量获取MongoDB连接字符串
- const mongoUri = process.env.MONGODB_URI || 'mongodb://admin:admin123@localhost:27017/ecommerce_dev?authSource=admin';
- log(`连接字符串: ${mongoUri.replace(/\/\/([^:]+):([^@]+)@/, '//***:***@')}`, colors.yellow);
-
- const client = new MongoClient(mongoUri);
-
- // 尝试连接
- await client.connect();
- const responseTime = Date.now() - startTime;
-
- // 测试基本操作
- const admin = client.db().admin();
- const serverStatus = await admin.serverStatus();
-
- // 获取数据库列表
- const databases = await admin.listDatabases();
-
- testResults.mongodb = {
- status: 'success',
- responseTime,
- error: null,
- details: {
- version: serverStatus.version,
- host: serverStatus.host,
- databases: databases.databases.length,
- uptime: serverStatus.uptime
- }
- };
-
- log(`✅ MongoDB连接成功!`, colors.green);
- log(` 响应时间: ${responseTime}ms`, colors.green);
- log(` MongoDB版本: ${serverStatus.version}`, colors.green);
- log(` 主机: ${serverStatus.host}`, colors.green);
- log(` 数据库数量: ${databases.databases.length}`, colors.green);
-
- await client.close();
- } catch (error) {
- const responseTime = Date.now() - startTime;
- testResults.mongodb = {
- status: 'failed',
- responseTime,
- error: error.message,
- details: {
- errorCode: error.code,
- errorName: error.name
- }
- };
-
- log(`❌ MongoDB连接失败!`, colors.red);
- log(` 错误: ${error.message}`, colors.red);
- log(` 响应时间: ${responseTime}ms`, colors.red);
- }
- }
- // 测试Redis连接
- async function testRedisConnection() {
- log('\n===== 测试Redis连接 =====', colors.blue);
- const startTime = Date.now();
-
- try {
- // 从环境变量获取Redis连接配置
- const redisHost = process.env.REDIS_HOST || 'localhost';
- const redisPort = process.env.REDIS_PORT || 6379;
- const redisUrl = process.env.REDIS_URL || `redis://${redisHost}:${redisPort}`;
-
- log(`连接地址: ${redisUrl}`, colors.yellow);
-
- const redis = new Redis(redisUrl);
-
- // 测试连接
- const pong = await redis.ping();
- const responseTime = Date.now() - startTime;
-
- // 测试基本操作
- const testKey = 'test_connection_' + Date.now();
- await redis.set(testKey, 'test_value', 'EX', 10);
- const getValue = await redis.get(testKey);
- await redis.del(testKey);
-
- // 获取Redis信息
- const info = await redis.info('server');
-
- testResults.redis = {
- status: 'success',
- responseTime,
- error: null,
- details: {
- pong,
- testResult: getValue === 'test_value',
- redisVersion: info.match(/redis_version:(.+)/)?.[1] || 'unknown'
- }
- };
-
- log(`✅ Redis连接成功!`, colors.green);
- log(` 响应时间: ${responseTime}ms`, colors.green);
- log(` PING响应: ${pong}`, colors.green);
- log(` 测试读写: ${getValue === 'test_value' ? '成功' : '失败'}`, colors.green);
- log(` Redis版本: ${info.match(/redis_version:(.+)/)?.[1] || 'unknown'}`, colors.green);
-
- await redis.quit();
- } catch (error) {
- const responseTime = Date.now() - startTime;
- testResults.redis = {
- status: 'failed',
- responseTime,
- error: error.message,
- details: {
- errorCode: error.code,
- errorName: error.name
- }
- };
-
- log(`❌ Redis连接失败!`, colors.red);
- log(` 错误: ${error.message}`, colors.red);
- log(` 响应时间: ${responseTime}ms`, colors.red);
- }
- }
- // 测试Parse Server连接
- async function testParseServerConnection() {
- log('\n===== 测试Parse Server连接 =====', colors.blue);
- const startTime = Date.now();
-
- try {
- // 从环境变量获取Parse Server配置
- const appId = process.env.PARSE_APP_ID || 'your-parse-application-id';
- const masterKey = process.env.PARSE_MASTER_KEY || 'your-parse-master-key-change-this';
- const serverURL = process.env.PARSE_SERVER_URL || 'http://localhost:1337/parse';
-
- log(`Parse Server URL: ${serverURL}`, colors.yellow);
- log(`Application ID: ${appId}`, colors.yellow);
-
- // 初始化Parse SDK
- Parse.initialize(appId, masterKey);
- Parse.serverURL = serverURL;
-
- // 测试连接 - 创建一个测试对象
- const TestObject = Parse.Object.extend('TestConnection');
- const testObject = new TestObject();
- testObject.set('message', 'Connection test at ' + new Date().toISOString());
-
- const savedObject = await testObject.save();
- const responseTime = Date.now() - startTime;
-
- // 测试查询
- const query = new Parse.Query(TestObject);
- query.equalTo('objectId', savedObject.id);
- const retrievedObject = await query.first();
-
- // 清理测试数据
- await retrievedObject.destroy();
-
- // 获取服务器状态
- const healthResponse = await fetch(`${serverURL}/health`).catch(() => null);
-
- testResults.parseServer = {
- status: 'success',
- responseTime,
- error: null,
- details: {
- objectId: savedObject.id,
- saveSuccess: true,
- retrieveSuccess: retrievedObject.id === savedObject.id,
- deleteSuccess: true,
- healthStatus: healthResponse ? healthResponse.status : 'not_available'
- }
- };
-
- log(`✅ Parse Server连接成功!`, colors.green);
- log(` 响应时间: ${responseTime}ms`, colors.green);
- log(` 对象保存: 成功`, colors.green);
- log(` 对象查询: 成功`, colors.green);
- log(` 对象删除: 成功`, colors.green);
- log(` 健康检查: ${healthResponse ? `HTTP ${healthResponse.status}` : '不可用'}`, colors.green);
- } catch (error) {
- const responseTime = Date.now() - startTime;
- testResults.parseServer = {
- status: 'failed',
- responseTime,
- error: error.message,
- details: {
- errorCode: error.code,
- errorName: error.name
- }
- };
-
- log(`❌ Parse Server连接失败!`, colors.red);
- log(` 错误: ${error.message}`, colors.red);
- log(` 响应时间: ${responseTime}ms`, colors.red);
- }
- }
- // 生成测试报告
- function generateReport() {
- log('\n\n===== 连接测试报告 =====', colors.blue);
- log(`测试时间: ${new Date().toISOString()}`, colors.yellow);
- log('========================', colors.blue);
-
- let allSuccess = true;
-
- // MongoDB报告
- log('\n【MongoDB】', colors.blue);
- if (testResults.mongodb.status === 'success') {
- log(`状态: ✅ 成功`, colors.green);
- log(`响应时间: ${testResults.mongodb.responseTime}ms`, colors.green);
- log(`版本: ${testResults.mongodb.details.version}`, colors.green);
- log(`主机: ${testResults.mongodb.details.host}`, colors.green);
- log(`数据库数量: ${testResults.mongodb.details.databases}`, colors.green);
- } else {
- log(`状态: ❌ 失败`, colors.red);
- log(`错误: ${testResults.mongodb.error}`, colors.red);
- allSuccess = false;
- }
-
- // Redis报告
- log('\n【Redis】', colors.blue);
- if (testResults.redis.status === 'success') {
- log(`状态: ✅ 成功`, colors.green);
- log(`响应时间: ${testResults.redis.responseTime}ms`, colors.green);
- log(`PING响应: ${testResults.redis.details.pong}`, colors.green);
- log(`测试读写: ${testResults.redis.details.testResult ? '成功' : '失败'}`, colors.green);
- log(`版本: ${testResults.redis.details.redisVersion}`, colors.green);
- } else {
- log(`状态: ❌ 失败`, colors.red);
- log(`错误: ${testResults.redis.error}`, colors.red);
- allSuccess = false;
- }
-
- // Parse Server报告
- log('\n【Parse Server】', colors.blue);
- if (testResults.parseServer.status === 'success') {
- log(`状态: ✅ 成功`, colors.green);
- log(`响应时间: ${testResults.parseServer.responseTime}ms`, colors.green);
- log(`对象保存: ${testResults.parseServer.details.saveSuccess ? '成功' : '失败'}`, colors.green);
- log(`对象查询: ${testResults.parseServer.details.retrieveSuccess ? '成功' : '失败'}`, colors.green);
- log(`对象删除: ${testResults.parseServer.details.deleteSuccess ? '成功' : '失败'}`, colors.green);
- log(`健康检查: ${testResults.parseServer.details.healthStatus}`, colors.green);
- } else {
- log(`状态: ❌ 失败`, colors.red);
- log(`错误: ${testResults.parseServer.error}`, colors.red);
- allSuccess = false;
- }
-
- // 总体状态
- log('\n========================', colors.blue);
- if (allSuccess) {
- log('总体状态: ✅ 所有服务连接正常', colors.green);
- } else {
- log('总体状态: ❌ 部分服务连接失败', colors.red);
- }
- log('========================', colors.blue);
-
- // 保存报告到文件
- const reportData = {
- timestamp: new Date().toISOString(),
- results: testResults,
- overallStatus: allSuccess ? 'success' : 'failed'
- };
-
- const fs = require('fs');
- fs.writeFileSync(
- './connection-test-report.json',
- JSON.stringify(reportData, null, 2)
- );
-
- log('\n详细报告已保存到: connection-test-report.json', colors.yellow);
-
- return allSuccess;
- }
- // 主函数
- async function runConnectionTests() {
- log('开始执行连接测试...', colors.blue);
-
- await testMongoDBConnection();
- await testRedisConnection();
- await testParseServerConnection();
-
- const allSuccess = generateReport();
-
- process.exit(allSuccess ? 0 : 1);
- }
- // 运行测试
- runConnectionTests().catch(error => {
- log(`\n测试执行过程中发生错误: ${error.message}`, colors.red);
- console.error(error);
- process.exit(1);
- });
|