使用JavaScript转换MariaDB客户端信息为JSON时遇错误求助
解决MariaDB客户端输出转JSON的JavaScript错误问题
原代码的核心问题
- 错误的分类逻辑:误将带冒号的行当作分类(比如
Connection id:被当成分类名),但实际上这些都是独立的键值对,不存在分类结构。 - 行拆分逻辑缺陷:
- 第一行无冒号的版本信息会被错误归类到
General下,导致结构混乱。 - 最后一行包含多组键值对(如
Threads: 11 Questions: 41743540474),原代码只会把第一个Threads当作键,后续内容全部合并为一个值,无法解析每个指标。
- 第一行无冒号的版本信息会被错误归类到
- 键名处理不当:带空格的键(如
Connection id)会被错误拆分,比如Connection id:会被拆成Connection和id:,导致键名错误。
修正后的代码
const input = ` mysql Ver 15.1 Distrib 10.4.22-MariaDB, for Linux (x86_64) using readline 5.1 Connection id: 11725017 Current database: Current user: cartadmin@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server: MariaDB Server version: 10.2.10-MariaDB-log MariaDB Server Protocol version: 10 Connection: 127.0.0.1 via TCP/IP Server characterset: latin1 Db characterset: latin1 Client characterset: utf8 Conn. characterset: utf8 TCP port: 3306 Uptime: 1255 days 10 hours 56 min 30 sec Threads: 11 Questions: 41743540474 Slow queries: 157520 Opens: 3668268 Flush tables: 47 Open tables: 512 Queries per second avg: 384.834 `; const data = {}; const lines = input.trim().split('\n'); // 处理第一行客户端版本信息 const clientVersionLine = lines.shift(); data.clientVersion = clientVersionLine.trim(); // 处理中间带冒号的单行键值对 for (let i = 0; i < lines.length; i++) { const line = lines[i].trim(); if (!line) continue; // 跳过空行 // 判断是否是最后一行的多键值对 if (line.includes('Threads:') && line.includes('Questions:')) { // 匹配每个key: value的组合 const metrics = line.match(/(\S[^:]+):\s*(\S.*?)(?=\s+\S[^:]+:|$)/g); metrics.forEach(metric => { const [key, value] = metric.split(':').map(item => item.trim()); data[key] = value; }); break; } // 处理单行键值对 const colonIndex = line.indexOf(':'); const key = line.slice(0, colonIndex).trim().replace(/\s+/g, ' '); // 清理键名多余空格 const value = line.slice(colonIndex + 1).trim(); data[key] = value; } const jsonData = JSON.stringify(data, null, 2); console.log(jsonData);
修正说明
- 单独处理版本行:把第一行无冒号的客户端版本信息直接存入
clientVersion字段。 - 正确解析单行键值对:通过冒号索引拆分键和值,同时清理键名中的多余空格(比如
Db characterset转为Db characterset)。 - 批量解析最后一行指标:用正则匹配所有
键: 值格式的组合,将每个指标单独存入JSON对象。
运行修正后的代码,就能得到结构正确的JSON输出,包含所有MariaDB客户端输出的信息。
内容的提问来源于stack exchange,提问作者Karthick Dkk
相关产品推荐
相关产品推荐

