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

NodeJS调用WHM API 1 getdiskusage接口返回JSON元素顺序随机问题

解决WHM API getdiskusage返回结果顺序随机的问题

这个问题的核心在于JavaScript普通对象并不保证键的顺序会和原始JSON字符串的顺序完全一致——虽然ES6+对对象键顺序有了一些规范,但它无法严格匹配API返回的JSON结构里的预期顺序,而WHM API文档里提到的“预期输出顺序”是指接口返回的JSON字符串的结构顺序。

下面给你两种可行的解决方案,同时先优化一下你代码里多余的异步逻辑(你当前的代码里有不必要的then(async (token) => { return await token }),可以简化):

优化后的基础代码

首先把代码里冗余的异步处理去掉,让逻辑更清晰:

const WHM = require('node-whm');
const whmClient = new WHM.Client({
  serverUrl: 'https://my.remotehost.com:2087',
  remoteAccessKey: 'xxxxxxxxxxxxxxxxxxxxxxxxx',
  username: 'xxxxxxxx'
});

async function getDiskInfo() {
  try {
    // 直接await获取响应,不需要额外的then包装
    const response = await whmClient.getdiskusage();
    return response;
  } catch(err){
    console.error('Error fetching disk info: ', err);
    throw err; // 抛出错误让上层catch处理
  }
}

方案1:手动按官方预期顺序构建结果(最可靠)

这种方式完全由你控制顺序,和WHM官方文档的输出顺序严格对齐,是最稳妥的方案:

getDiskInfo()
.then(rawData => {
  const parsedData = JSON.parse(rawData);
  // 按照WHM API文档里的预期顺序定义分区键的顺序
  const expectedPartitionOrder = [
    '/dev/sda1', 
    '/dev/sda2', 
    // 这里补充你实际需要的其他分区键
  ];

  // 按预期顺序生成有序数组
  const orderedPartitions = expectedPartitionOrder
    .map(partitionKey => {
      const partitionData = parsedData.data.partition[partitionKey];
      if (partitionData) {
        return { partition: partitionKey, ...partitionData };
      }
      return null;
    })
    .filter(item => item !== null); // 过滤掉不存在的分区

  console.table(orderedPartitions);
})
.catch(err => {
  console.error('Error processing disk info: ', err);
});

方案2:用Map保留原始JSON的键顺序

如果不想手动维护顺序,你可以利用JSON.parse的reviver函数,把分区数据存入Map(Map会严格保留键的插入顺序,也就是JSON字符串里的原始顺序):

getDiskInfo()
.then(rawData => {
  let partitionMap;
  JSON.parse(rawData, (key, value) => {
    // 当解析到partition字段时,把它的键值对存入Map
    if (key === 'partition') {
      partitionMap = new Map();
      for (const prop in value) {
        partitionMap.set(prop, value[prop]);
      }
      return partitionMap;
    }
    return value;
  });

  // 把Map转换成数组,方便用console.table展示
  const orderedPartitionArray = Array.from(partitionMap.entries())
    .map(([partitionKey, data]) => ({ partition: partitionKey, ...data }));
  
  console.table(orderedPartitionArray);
})
.catch(err => {
  console.error('Error processing disk info: ', err);
});

为什么会出现顺序随机的情况?

WHM API返回的JSON字符串是有顺序的,但当你用JSON.parse把它转换成JavaScript对象后,对象的键顺序会遵循ES6+的规则:整数类型的键会被排序,其他键按插入顺序,但这个插入顺序并不一定和原始JSON字符串的顺序完全一致(不同JavaScript引擎可能有细微差异),所以就出现了你看到的“顺序随机”的问题。

内容的提问来源于stack exchange,提问作者Cadmos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:34:00