You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JavaScript转换MariaDB客户端信息为JSON时遇错误求助

解决MariaDB客户端输出转JSON的JavaScript错误问题

原代码的核心问题

  1. 错误的分类逻辑:误将带冒号的行当作分类(比如Connection id:被当成分类名),但实际上这些都是独立的键值对,不存在分类结构。
  2. 行拆分逻辑缺陷:
    • 第一行无冒号的版本信息会被错误归类到General下,导致结构混乱。
    • 最后一行包含多组键值对(如Threads: 11 Questions: 41743540474),原代码只会把第一个Threads当作键,后续内容全部合并为一个值,无法解析每个指标。
  3. 键名处理不当:带空格的键(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 10:07:17