JavaScript中用fetch获取解析远程状态指标需发起HTTP请求、处理JSON响应并提取字段;推荐fetch API,注意认证、错误处理、结构校验及定时轮询策略。

JavaScript 中使用 Ajax 获取并解析远程服务器的状态指标,核心是发起 HTTP 请求、正确处理响应数据(通常是 JSON)、并提取所需指标字段。现代推荐用 fetch API,简洁可靠;兼容旧环境可选 XMLHttpRequest。
用 fetch 获取 JSON 格式的状态指标
大多数监控接口(如 Prometheus 的 /api/v1/query、自建健康检查端点)返回结构化 JSON。fetch 默认不带凭证,若需认证或跨域,请配置 credentials 和 headers:
- 确保服务器响应头包含
Content-Type: application/json - 用
.then(res => res.json())自动解析 JSON,无需手动JSON.parse - 捕获网络错误和 HTTP 错误状态(如 404、500),
res.ok判断请求是否成功
示例:
fetch('/api/status', {
method: 'GET',
headers: { 'Authorization': 'Bearer abc123' }
})
.then(res => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
})
.then(data => {
console.log('CPU 使用率:', data.metrics.cpu_usage);
console.log('内存剩余:', data.metrics.memory_free_mb);
})
.catch(err => console.error('获取状态失败:', err.message));
处理常见状态指标响应结构
不同后端返回格式差异大,解析前先确认结构。典型模式有:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
扁平对象:直接
data.cpu, data.memory -
嵌套指标组:如
data.system.load.avg_1m或data.metrics[0].value -
Prometheus 类响应:需取
data.data.result[0].value[1](当前值) -
带时间戳的数组:用
Array.map()提取数值列
建议加一层校验,避免访问 undefined:
const cpu = data?.metrics?.cpu_usage ?? 0; const uptime = Number(data?.system?.uptime_seconds) || 0;
定时轮询状态指标(适合实时看板)
用 setInterval 定期拉取,但注意控制频率(如 5–30 秒),避免压垮服务或被限流:
- 每次请求前清除上一轮定时器,防止页面切换后残留
- 失败时指数退避重试(如首次等 1s,再失败等 2s、4s…)
- 加载中显示 skeleton 或禁用刷新按钮,提升体验
简单轮询示例:
let pollTimer;
function startPolling() {
pollTimer = setInterval(() => {
fetch('/api/health').then(r => r.json()).then(updateDashboard);
}, 10000); // 每 10 秒一次
}
function stopPolling() {
clearInterval(pollTimer);
}
错误与边界情况处理
生产环境必须覆盖这些场景:
- 网络中断:fetch 本身会 reject,catch 即可
-
JSON 解析失败:后端返回 HTML 错误页或空响应时,
res.json()抛错 -
字段缺失:用可选链(
?.)+ 空值合并(??)安全取值 -
跨域限制:确认服务端设置了
Access-Control-Allow-Origin
完整健壮写法片段:
async function fetchStatus() {
try {
const res = await fetch('/api/metrics');
if (!res.ok) throw new Error(`API error: ${res.status}`);
const json = await res.json();
return {
cpu: json.metrics?.cpu_percent ?? 0,
disk: json.storage?.used_percent ?? 0,
timestamp: new Date().toISOString()
};
} catch (err) {
console.warn('状态获取异常,使用缓存值或默认值', err);
return { cpu: -1, disk: -1, timestamp: null };
}
}

















