test-connections.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. const { MongoClient } = require('mongodb');
  2. const Redis = require('ioredis');
  3. const Parse = require('parse/node');
  4. require('dotenv').config();
  5. // 测试结果收集器
  6. const testResults = {
  7. mongodb: {
  8. status: 'pending',
  9. responseTime: null,
  10. error: null,
  11. details: {}
  12. },
  13. redis: {
  14. status: 'pending',
  15. responseTime: null,
  16. error: null,
  17. details: {}
  18. },
  19. parseServer: {
  20. status: 'pending',
  21. responseTime: null,
  22. error: null,
  23. details: {}
  24. }
  25. };
  26. // 颜色输出函数
  27. const colors = {
  28. green: '\x1b[32m',
  29. red: '\x1b[31m',
  30. yellow: '\x1b[33m',
  31. blue: '\x1b[34m',
  32. reset: '\x1b[0m'
  33. };
  34. function log(message, color = colors.reset) {
  35. console.log(`${color}${message}${colors.reset}`);
  36. }
  37. // 测试MongoDB连接
  38. async function testMongoDBConnection() {
  39. log('\n===== 测试MongoDB连接 =====', colors.blue);
  40. const startTime = Date.now();
  41. try {
  42. // 从环境变量获取MongoDB连接字符串
  43. const mongoUri = process.env.MONGODB_URI || 'mongodb://admin:admin123@localhost:27017/ecommerce_dev?authSource=admin';
  44. log(`连接字符串: ${mongoUri.replace(/\/\/([^:]+):([^@]+)@/, '//***:***@')}`, colors.yellow);
  45. const client = new MongoClient(mongoUri);
  46. // 尝试连接
  47. await client.connect();
  48. const responseTime = Date.now() - startTime;
  49. // 测试基本操作
  50. const admin = client.db().admin();
  51. const serverStatus = await admin.serverStatus();
  52. // 获取数据库列表
  53. const databases = await admin.listDatabases();
  54. testResults.mongodb = {
  55. status: 'success',
  56. responseTime,
  57. error: null,
  58. details: {
  59. version: serverStatus.version,
  60. host: serverStatus.host,
  61. databases: databases.databases.length,
  62. uptime: serverStatus.uptime
  63. }
  64. };
  65. log(`✅ MongoDB连接成功!`, colors.green);
  66. log(` 响应时间: ${responseTime}ms`, colors.green);
  67. log(` MongoDB版本: ${serverStatus.version}`, colors.green);
  68. log(` 主机: ${serverStatus.host}`, colors.green);
  69. log(` 数据库数量: ${databases.databases.length}`, colors.green);
  70. await client.close();
  71. } catch (error) {
  72. const responseTime = Date.now() - startTime;
  73. testResults.mongodb = {
  74. status: 'failed',
  75. responseTime,
  76. error: error.message,
  77. details: {
  78. errorCode: error.code,
  79. errorName: error.name
  80. }
  81. };
  82. log(`❌ MongoDB连接失败!`, colors.red);
  83. log(` 错误: ${error.message}`, colors.red);
  84. log(` 响应时间: ${responseTime}ms`, colors.red);
  85. }
  86. }
  87. // 测试Redis连接
  88. async function testRedisConnection() {
  89. log('\n===== 测试Redis连接 =====', colors.blue);
  90. const startTime = Date.now();
  91. try {
  92. // 从环境变量获取Redis连接配置
  93. const redisHost = process.env.REDIS_HOST || 'localhost';
  94. const redisPort = process.env.REDIS_PORT || 6379;
  95. const redisUrl = process.env.REDIS_URL || `redis://${redisHost}:${redisPort}`;
  96. log(`连接地址: ${redisUrl}`, colors.yellow);
  97. const redis = new Redis(redisUrl);
  98. // 测试连接
  99. const pong = await redis.ping();
  100. const responseTime = Date.now() - startTime;
  101. // 测试基本操作
  102. const testKey = 'test_connection_' + Date.now();
  103. await redis.set(testKey, 'test_value', 'EX', 10);
  104. const getValue = await redis.get(testKey);
  105. await redis.del(testKey);
  106. // 获取Redis信息
  107. const info = await redis.info('server');
  108. testResults.redis = {
  109. status: 'success',
  110. responseTime,
  111. error: null,
  112. details: {
  113. pong,
  114. testResult: getValue === 'test_value',
  115. redisVersion: info.match(/redis_version:(.+)/)?.[1] || 'unknown'
  116. }
  117. };
  118. log(`✅ Redis连接成功!`, colors.green);
  119. log(` 响应时间: ${responseTime}ms`, colors.green);
  120. log(` PING响应: ${pong}`, colors.green);
  121. log(` 测试读写: ${getValue === 'test_value' ? '成功' : '失败'}`, colors.green);
  122. log(` Redis版本: ${info.match(/redis_version:(.+)/)?.[1] || 'unknown'}`, colors.green);
  123. await redis.quit();
  124. } catch (error) {
  125. const responseTime = Date.now() - startTime;
  126. testResults.redis = {
  127. status: 'failed',
  128. responseTime,
  129. error: error.message,
  130. details: {
  131. errorCode: error.code,
  132. errorName: error.name
  133. }
  134. };
  135. log(`❌ Redis连接失败!`, colors.red);
  136. log(` 错误: ${error.message}`, colors.red);
  137. log(` 响应时间: ${responseTime}ms`, colors.red);
  138. }
  139. }
  140. // 测试Parse Server连接
  141. async function testParseServerConnection() {
  142. log('\n===== 测试Parse Server连接 =====', colors.blue);
  143. const startTime = Date.now();
  144. try {
  145. // 从环境变量获取Parse Server配置
  146. const appId = process.env.PARSE_APP_ID || 'your-parse-application-id';
  147. const masterKey = process.env.PARSE_MASTER_KEY || 'your-parse-master-key-change-this';
  148. const serverURL = process.env.PARSE_SERVER_URL || 'http://localhost:1337/parse';
  149. log(`Parse Server URL: ${serverURL}`, colors.yellow);
  150. log(`Application ID: ${appId}`, colors.yellow);
  151. // 初始化Parse SDK
  152. Parse.initialize(appId, masterKey);
  153. Parse.serverURL = serverURL;
  154. // 测试连接 - 创建一个测试对象
  155. const TestObject = Parse.Object.extend('TestConnection');
  156. const testObject = new TestObject();
  157. testObject.set('message', 'Connection test at ' + new Date().toISOString());
  158. const savedObject = await testObject.save();
  159. const responseTime = Date.now() - startTime;
  160. // 测试查询
  161. const query = new Parse.Query(TestObject);
  162. query.equalTo('objectId', savedObject.id);
  163. const retrievedObject = await query.first();
  164. // 清理测试数据
  165. await retrievedObject.destroy();
  166. // 获取服务器状态
  167. const healthResponse = await fetch(`${serverURL}/health`).catch(() => null);
  168. testResults.parseServer = {
  169. status: 'success',
  170. responseTime,
  171. error: null,
  172. details: {
  173. objectId: savedObject.id,
  174. saveSuccess: true,
  175. retrieveSuccess: retrievedObject.id === savedObject.id,
  176. deleteSuccess: true,
  177. healthStatus: healthResponse ? healthResponse.status : 'not_available'
  178. }
  179. };
  180. log(`✅ Parse Server连接成功!`, colors.green);
  181. log(` 响应时间: ${responseTime}ms`, colors.green);
  182. log(` 对象保存: 成功`, colors.green);
  183. log(` 对象查询: 成功`, colors.green);
  184. log(` 对象删除: 成功`, colors.green);
  185. log(` 健康检查: ${healthResponse ? `HTTP ${healthResponse.status}` : '不可用'}`, colors.green);
  186. } catch (error) {
  187. const responseTime = Date.now() - startTime;
  188. testResults.parseServer = {
  189. status: 'failed',
  190. responseTime,
  191. error: error.message,
  192. details: {
  193. errorCode: error.code,
  194. errorName: error.name
  195. }
  196. };
  197. log(`❌ Parse Server连接失败!`, colors.red);
  198. log(` 错误: ${error.message}`, colors.red);
  199. log(` 响应时间: ${responseTime}ms`, colors.red);
  200. }
  201. }
  202. // 生成测试报告
  203. function generateReport() {
  204. log('\n\n===== 连接测试报告 =====', colors.blue);
  205. log(`测试时间: ${new Date().toISOString()}`, colors.yellow);
  206. log('========================', colors.blue);
  207. let allSuccess = true;
  208. // MongoDB报告
  209. log('\n【MongoDB】', colors.blue);
  210. if (testResults.mongodb.status === 'success') {
  211. log(`状态: ✅ 成功`, colors.green);
  212. log(`响应时间: ${testResults.mongodb.responseTime}ms`, colors.green);
  213. log(`版本: ${testResults.mongodb.details.version}`, colors.green);
  214. log(`主机: ${testResults.mongodb.details.host}`, colors.green);
  215. log(`数据库数量: ${testResults.mongodb.details.databases}`, colors.green);
  216. } else {
  217. log(`状态: ❌ 失败`, colors.red);
  218. log(`错误: ${testResults.mongodb.error}`, colors.red);
  219. allSuccess = false;
  220. }
  221. // Redis报告
  222. log('\n【Redis】', colors.blue);
  223. if (testResults.redis.status === 'success') {
  224. log(`状态: ✅ 成功`, colors.green);
  225. log(`响应时间: ${testResults.redis.responseTime}ms`, colors.green);
  226. log(`PING响应: ${testResults.redis.details.pong}`, colors.green);
  227. log(`测试读写: ${testResults.redis.details.testResult ? '成功' : '失败'}`, colors.green);
  228. log(`版本: ${testResults.redis.details.redisVersion}`, colors.green);
  229. } else {
  230. log(`状态: ❌ 失败`, colors.red);
  231. log(`错误: ${testResults.redis.error}`, colors.red);
  232. allSuccess = false;
  233. }
  234. // Parse Server报告
  235. log('\n【Parse Server】', colors.blue);
  236. if (testResults.parseServer.status === 'success') {
  237. log(`状态: ✅ 成功`, colors.green);
  238. log(`响应时间: ${testResults.parseServer.responseTime}ms`, colors.green);
  239. log(`对象保存: ${testResults.parseServer.details.saveSuccess ? '成功' : '失败'}`, colors.green);
  240. log(`对象查询: ${testResults.parseServer.details.retrieveSuccess ? '成功' : '失败'}`, colors.green);
  241. log(`对象删除: ${testResults.parseServer.details.deleteSuccess ? '成功' : '失败'}`, colors.green);
  242. log(`健康检查: ${testResults.parseServer.details.healthStatus}`, colors.green);
  243. } else {
  244. log(`状态: ❌ 失败`, colors.red);
  245. log(`错误: ${testResults.parseServer.error}`, colors.red);
  246. allSuccess = false;
  247. }
  248. // 总体状态
  249. log('\n========================', colors.blue);
  250. if (allSuccess) {
  251. log('总体状态: ✅ 所有服务连接正常', colors.green);
  252. } else {
  253. log('总体状态: ❌ 部分服务连接失败', colors.red);
  254. }
  255. log('========================', colors.blue);
  256. // 保存报告到文件
  257. const reportData = {
  258. timestamp: new Date().toISOString(),
  259. results: testResults,
  260. overallStatus: allSuccess ? 'success' : 'failed'
  261. };
  262. const fs = require('fs');
  263. fs.writeFileSync(
  264. './connection-test-report.json',
  265. JSON.stringify(reportData, null, 2)
  266. );
  267. log('\n详细报告已保存到: connection-test-report.json', colors.yellow);
  268. return allSuccess;
  269. }
  270. // 主函数
  271. async function runConnectionTests() {
  272. log('开始执行连接测试...', colors.blue);
  273. await testMongoDBConnection();
  274. await testRedisConnection();
  275. await testParseServerConnection();
  276. const allSuccess = generateReport();
  277. process.exit(allSuccess ? 0 : 1);
  278. }
  279. // 运行测试
  280. runConnectionTests().catch(error => {
  281. log(`\n测试执行过程中发生错误: ${error.message}`, colors.red);
  282. console.error(error);
  283. process.exit(1);
  284. });