# 调试工具和方法 **本文档中引用的文件** - [README.md](file://README.md) - [package.json](file://package.json) - [index.js](file://index.js) - [TsCommon.js](file://src/utils/TsCommon.js) - [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js) - [TsStorage.js](file://src/utils/TsStorage.js) - [TsCrypto.js](file://src/utils/TsCrypto.js) - [TsSM4.js](file://src/utils/TsSM4.js) - [TsHttpUtil.js](file://src/https/TsHttpUtil.js) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概览](#架构概览) 5. [详细组件分析](#详细组件分析) 6. [调试工具集成指南](#调试工具集成指南) 7. [调试技术与方法](#调试技术与方法) 8. [性能监控与优化](#性能监控与优化) 9. [故障排查指南](#故障排查指南) 10. [最佳实践总结](#最佳实践总结) ## 简介 本指南专注于如何有效使用各种调试工具和技术来诊断和解决基于 Node.js 的 npm 工具包问题。该工具包提供了通用方法、网络请求、存储管理、加密解密等功能模块,涵盖了现代 Web 应用开发中的常见调试场景。 ## 项目结构 该项目采用模块化设计,主要包含以下核心模块: ```mermaid graph TB subgraph "主入口" Index[index.js] end subgraph "工具模块" Common[TsCommon.js
通用工具函数] Crypto[TsCrypto.js
加密解密] Storage[TsStorage.js
数据存储] Config[TsGlobalConfig.js
全局配置] SM4[TsSM4.js
SM4算法实现] end subgraph "HTTP模块" HttpUtil[TsHttpUtil.js
网络请求封装] end subgraph "依赖" UmiRequest[umi-request
HTTP客户端] Base64[base64-js
Base64编码] end Index --> Common Index --> Crypto Index --> Storage Index --> Config Index --> SM4 Index --> HttpUtil HttpUtil --> Storage HttpUtil --> Crypto HttpUtil --> Config HttpUtil --> Common Crypto --> SM4 Crypto --> Config Crypto --> Base64 HttpUtil --> UmiRequest ``` **图表来源** - [index.js:1-16](file://index.js#L1-L16) - [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171) - [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34) **章节来源** - [index.js:1-16](file://index.js#L1-L16) - [package.json:1-24](file://package.json#L1-L24) ## 核心组件 ### 通用工具模块 (TsCommon.js) 提供基础的 JavaScript 工具函数,包括: - URL 参数解析 - 数据类型检查 - JSON 解析安全处理 - 字符串操作 - 环境检测 ### 网络请求模块 (TsHttpUtil.js) 基于 umi-request 封装的 HTTP 客户端,支持: - 自动错误处理 - 请求参数预处理 - 数据加密传输 - 响应数据解密 - Token 自动注入 ### 存储模块 (TsStorage.js) 本地存储管理,支持: - 对象序列化存储 - 用户 Token 管理 - 加密开关控制 - 类型安全的数据获取 ### 加密模块 (TsCrypto.js) 基于 SM4 算法的加密解密工具,包含: - SM4 算法实现 - Base64 编码支持 - 动态密钥处理 - 加密模式配置 **章节来源** - [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98) - [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171) - [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55) - [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34) ## 架构概览 ```mermaid sequenceDiagram participant Client as 客户端应用 participant HttpUtil as HTTP工具 participant Crypto as 加密模块 participant Storage as 存储模块 participant Server as 服务器 Client->>HttpUtil : 发起请求 HttpUtil->>Storage : 获取用户Token Storage-->>HttpUtil : 返回Token HttpUtil->>HttpUtil : 处理请求参数 HttpUtil->>Crypto : 加密请求数据(可选) Crypto-->>HttpUtil : 返回加密结果 HttpUtil->>Server : 发送HTTP请求 Server-->>HttpUtil : 返回响应 HttpUtil->>Crypto : 解密响应数据(可选) Crypto-->>HttpUtil : 返回解密结果 HttpUtil-->>Client : 返回处理后的数据 ``` **图表来源** - [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134) - [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30) - [TsStorage.js:9-15](file://src/utils/TsStorage.js#L9-L15) ## 详细组件分析 ### HTTP 请求流程分析 ```mermaid flowchart TD Start([开始请求]) --> CheckPrefix["检查URL前缀配置"] CheckPrefix --> AddPrefix["添加URL前缀"] AddPrefix --> ParamsPrep["参数预处理"] ParamsPrep --> CheckEncryption{"检查加密开关"} CheckEncryption --> |开启| EncryptData["加密请求数据"] CheckEncryption --> |关闭| SkipEncrypt["跳过加密"] EncryptData --> AddToken["添加用户Token"] SkipEncrypt --> AddToken AddToken --> SendRequest["发送HTTP请求"] SendRequest --> CheckResponse{"检查响应状态"} CheckResponse --> |成功| DecryptData["解密响应数据(可选)"] CheckResponse --> |失败| ErrorHandler["错误处理"] DecryptData --> ParseJSON["解析JSON数据"] ParseJSON --> ReturnSuccess["返回成功响应"] ErrorHandler --> ReturnError["返回错误响应"] ``` **图表来源** - [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134) - [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91) ### 加密解密流程分析 ```mermaid classDiagram class TsCrypto { -SM4 sm4 +constructor() +encrypt(content) String +decrypt(base64) String } class TsSM4 { -Uint8Array key -Uint8Array iv -String mode -String cipherType -Uint32Array encryptRoundKeys -Uint32Array decryptRoundKeys +constructor(config) +encrypt(plaintext) String +decrypt(ciphertext) String -padding(buffer) Uint8Array -dePadding(buffer) Uint8Array } class TsGlobalConfig { +defaultConfig +getConfig() Object +setConfig(obj) void } TsCrypto --> TsSM4 : 使用 TsCrypto --> TsGlobalConfig : 读取配置 TsSM4 --> TsGlobalConfig : 读取密钥 ``` **图表来源** - [TsCrypto.js:5-34](file://src/utils/TsCrypto.js#L5-L34) - [TsSM4.js:96-453](file://src/utils/TsSM4.js#L96-L453) - [TsGlobalConfig.js:19-33](file://src/utils/TsGlobalConfig.js#L19-L33) **章节来源** - [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171) - [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34) - [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456) ## 调试工具集成指南 ### 浏览器开发者工具调试 #### 1. 断点设置技巧 **网络请求断点**: - 在 `TsHttpUtil.js` 的 `req` 函数中设置断点 - 检查 `dealParamsBody` 函数中的参数处理逻辑 - 监控 `errorHandler` 函数的错误处理流程 **加密解密断点**: - 在 `TsCrypto.js` 的 `encrypt` 和 `decrypt` 方法中设置断点 - 监控 `TsSM4.js` 中的加密算法执行过程 - 检查 Base64 编码解码的中间结果 #### 2. 变量检查方法 **关键变量监控**: - `window.httpConfig` - 全局配置对象 - `localStorage` - 本地存储数据 - `process.env.NODE_ENV` - 环境变量 - 请求头中的 `token` 字段 #### 3. 控制台调试命令 ```javascript // 检查全局配置 console.log('HTTP配置:', window.httpConfig); // 检查存储状态 console.log('用户Token:', Storage.getUserToken()); console.log('加密开关:', Storage.getEncryptBody()); // 检查请求参数 console.log('请求参数:', dealParamsBody(options)); ``` ### Node.js 调试器使用 #### 1. 启动调试会话 ```bash # 使用 inspect 模式启动 node --inspect-brk=9229 index.js # 或者使用 nodemon 进行热重载调试 nodemon --inspect-brk=9229 index.js ``` #### 2. VS Code 调试配置 创建 `.vscode/launch.json`: ```json { "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "调试 npm 工具包", "program": "${workspaceFolder}/index.js", "args": [], "console": "integratedTerminal", "internalConsoleOptions": "neverOpen" } ] } ``` #### 3. 条件断点设置 在 Node.js 中可以设置更精确的断点条件: ```javascript // 在加密函数中设置条件断点 if (typeof content === 'object') { debugger; // 仅当内容为对象时触发 } // 在特定 URL 时断点 if (url.includes('api')) { debugger; // 仅在 API 请求时触发 } ``` **章节来源** - [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35) - [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30) - [TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43) ## 调试技术与方法 ### 日志记录策略 #### 1. 结构化日志记录 ```javascript // 在关键函数中添加日志 function debugLog(operation, data, result) { console.log(`[${new Date().toISOString()}] ${operation}`, { data: JSON.stringify(data), result: JSON.stringify(result), stack: new Error().stack }); } // 使用示例 debugLog('HTTP请求', {url, options}, response); ``` #### 2. 环境特定的日志级别 ```javascript // 开发环境启用详细日志 if (Common.isDevelopment()) { console.debug('详细调试信息'); console.trace('调用栈跟踪'); } // 生产环境限制日志输出 console.warn('警告信息'); console.error('错误信息'); ``` #### 3. 性能日志记录 ```javascript // 记录函数执行时间 function performanceLog(funcName, callback) { const start = performance.now(); try { const result = callback(); const end = performance.now(); console.log(`${funcName} 执行时间: ${end - start}ms`); return result; } catch (error) { const end = performance.now(); console.error(`${funcName} 执行失败: ${end - start}ms`, error); throw error; } } ``` ### 错误追踪方法 #### 1. 异步错误处理 ```javascript // 在 Promise 中添加错误处理 async function safeRequest(url, options) { try { const response = await req(url, options); return response; } catch (error) { console.error('请求失败:', { url, error: error.message, stack: error.stack, timestamp: new Date() }); throw error; } } ``` #### 2. 错误边界捕获 ```javascript // 全局错误捕获 process.on('unhandledRejection', (reason, promise) => { console.error('未处理的 Promise 拒绝:', { reason: reason.message, stack: reason.stack, promise: promise }); }); process.on('uncaughtException', (error) => { console.error('未捕获的异常:', { error: error.message, stack: error.stack, timestamp: new Date() }); }); ``` #### 3. 调试信息收集 ```javascript // 收集调试信息的工具函数 function collectDebugInfo() { return { timestamp: new Date(), environment: process.env.NODE_ENV, userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'Node.js', memory: process.memoryUsage(), config: { httpConfig: window.httpConfig, encryptBody: Storage.getEncryptBody() } }; } ``` ### 性能监控技巧 #### 1. 内存使用监控 ```javascript // 监控内存使用情况 function monitorMemory() { const usage = process.memoryUsage(); console.log('内存使用:', { rss: `${Math.round(usage.rss / 1024 / 1024)} MB`, heapTotal: `${Math.round(usage.heapTotal / 1024 / 1024)} MB`, heapUsed: `${Math.round(usage.heapUsed / 1024 / 1024)} MB` }); } // 定期监控 setInterval(monitorMemory, 5000); ``` #### 2. 网络性能监控 ```javascript // 监控 HTTP 请求性能 function monitorHttpRequest(url, startTime, endTime, status) { const duration = endTime - startTime; console.log('HTTP 请求性能:', { url, duration: `${duration}ms`, status, timestamp: new Date() }); // 性能阈值告警 if (duration > 3000) { console.warn(`慢请求警告: ${url} (${duration}ms)`); } } ``` #### 3. 加密性能监控 ```javascript // 监控加密解密性能 function monitorCryptoOperation(operation, dataLength, startTime, endTime) { const duration = endTime - startTime; console.log(`${operation} 性能:`, { dataLength: `${dataLength} 字节`, duration: `${duration}ms`, throughput: `${(dataLength / duration).toFixed(2)} 字节/ms` }); } ``` **章节来源** - [TsCommon.js:63-65](file://src/utils/TsCommon.js#L63-L65) - [TsHttpUtil.js:7-23](file://src/https/TsHttpUtil.js#L7-L23) - [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30) ## 故障排查指南 ### 常见问题诊断 #### 1. 网络请求问题 **问题症状**: - 请求超时 - 401 未授权 - CORS 跨域错误 **诊断步骤**: 1. 检查 Token 是否正确设置 2. 验证 URL 前缀配置 3. 确认请求头设置 4. 检查服务器响应格式 ```javascript // 调试网络请求 function debugNetworkRequest(url, options) { console.log('请求详情:', { url: url, options: JSON.stringify(options), token: Storage.getUserToken(), config: GlobalConfig.getConfig() }); return req(url, options) .catch(error => { console.error('请求失败:', { url: url, error: error.message, response: error.response, stack: error.stack }); throw error; }); } ``` #### 2. 加密解密问题 **问题症状**: - 解密失败 - 数据损坏 - 性能问题 **诊断步骤**: 1. 验证密钥配置 2. 检查数据格式 3. 确认加密模式 4. 监控性能指标 ```javascript // 调试加密解密 function debugCryptoOperation(operation, data) { console.log(`${operation} 输入:`, { data: data, dataType: typeof data, dataLength: data ? data.length : 0 }); try { const result = operation(data); console.log(`${operation} 输出:`, { result: result, resultType: typeof result, resultLength: result ? result.length : 0 }); return result; } catch (error) { console.error(`${operation} 失败:`, { error: error.message, stack: error.stack }); throw error; } } ``` #### 3. 存储问题 **问题症状**: - 数据丢失 - 解析失败 - 类型不匹配 **诊断步骤**: 1. 检查 localStorage 状态 2. 验证数据序列化 3. 确认默认值处理 4. 监控存储容量 ```javascript // 调试存储操作 function debugStorageOperation(operation, key, value) { console.log(`存储操作: ${operation}`, { key: key, value: value, storageSize: localStorage.length, storageKeys: Object.keys(localStorage) }); try { const result = operation(key, value); console.log(`存储结果:`, { key: key, storedValue: localStorage.getItem(key), parsedValue: Common.parseJSON(localStorage.getItem(key)) }); return result; } catch (error) { console.error(`存储失败:`, { error: error.message, stack: error.stack }); throw error; } } ``` ### 调试工具使用示例 #### 1. 浏览器控制台调试 ```javascript // 快速测试函数 function testFunction() { // 设置断点 debugger; // 检查当前状态 console.log('当前配置:', GlobalConfig.getConfig()); console.log('用户信息:', { token: Storage.getUserToken(), encryptBody: Storage.getEncryptBody() }); // 执行测试 return TsCommon.isEmpty(''); } // 执行测试 testFunction(); ``` #### 2. Node.js 调试会话 ```javascript // 创建调试脚本 const debugScript = async () => { console.log('开始调试会话'); // 设置断点 debugger; // 测试加密功能 const testData = {message: 'Hello World'}; const encrypted = TsCrypto.encrypt(JSON.stringify(testData)); const decrypted = TsCrypto.decrypt(encrypted); console.log('加密测试:', { original: testData, encrypted: encrypted, decrypted: JSON.parse(decrypted) }); // 测试网络请求 try { const response = await TsHttpUtil.get('/api/test'); console.log('网络请求测试:', response); } catch (error) { console.error('网络请求失败:', error); } }; debugScript(); ``` #### 3. 性能分析 ```javascript // 性能基准测试 function performanceBenchmark() { const iterations = 1000; const testData = 'Test data for encryption'.repeat(100); console.time('批量加密'); for (let i = 0; i < iterations; i++) { TsCrypto.encrypt(testData); } console.timeEnd('批量加密'); console.time('批量解密'); const encryptedData = TsCrypto.encrypt(testData); for (let i = 0; i < iterations; i++) { TsCrypto.decrypt(encryptedData); } console.timeEnd('批量解密'); } performanceBenchmark(); ``` **章节来源** - [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134) - [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30) - [TsStorage.js:31-43](file://src/utils/TsStorage.js#L31-L43) ## 最佳实践总结 ### 系统性调试方法 #### 1. 分层调试策略 ```mermaid flowchart TD Problem[问题出现] --> Identify[识别问题类型] Identify --> Isolate[隔离问题范围] Isolate --> Test[测试最小复现] Test --> Debug[深入调试] Debug --> Fix[修复问题] Fix --> Verify[验证修复] Verify --> Monitor[持续监控] Identify --> |网络问题| NetworkDebug[网络调试] Identify --> |加密问题| CryptoDebug[加密调试] Identify --> |存储问题| StorageDebug[存储调试] Identify --> |性能问题| PerfDebug[性能调试] NetworkDebug --> Test CryptoDebug --> Test StorageDebug --> Test PerfDebug --> Test ``` #### 2. 调试工具组合使用 **多工具协同调试**: - 浏览器开发者工具 + Node.js 调试器 - 控制台日志 + 断点调试 - 性能分析 + 内存监控 - 错误追踪 + 堆栈分析 #### 3. 调试效率提升技巧 **快速定位问题**: - 使用条件断点减少调试时间 - 实施渐进式调试策略 - 建立标准化的调试流程 - 维护调试知识库 **调试报告模板**: ```markdown # 调试报告 ## 问题描述 - 问题现象: - 影响范围: - 复现频率: ## 调试过程 - 关键断点位置: - 观察到的异常行为: - 相关日志信息: ## 根因分析 - 问题原因: - 影响因素: - 代码路径: ## 解决方案 - 临时修复: - 永久解决方案: - 预防措施: ## 验证结果 - 修复验证: - 回归测试: - 性能影响: ``` ### 调试工具配置建议 #### 1. 开发环境配置 ```javascript // 开发环境调试配置 const devConfig = { enableLogging: true, logLevel: 'debug', enableBreakpoints: true, autoReload: true, verboseErrors: true }; // 生产环境调试配置 const prodConfig = { enableLogging: false, logLevel: 'error', enableBreakpoints: false, autoReload: false, verboseErrors: false }; ``` #### 2. 调试工具推荐 **必备工具**: - 浏览器开发者工具 - VS Code 调试器 - Node.js Inspector - Chrome DevTools - Postman/Fiddler **高级工具**: - Performance Profiler - Memory Profiler - Network Monitor - Console Logger 通过遵循这些调试工具和方法指南,开发者可以更高效地诊断和解决基于该 npm 工具包的各种问题,提高开发效率和代码质量。