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
相关产品推荐
相关产品推荐

