使用Node.js解析kubectl输出遇TypeError:item.spec.map不是函数
问题:解析Kubectl Deployment JSON时出现TypeError: item.spec.map is not a function
我通过Node.js的child_process执行kubectl命令获取Deployment的JSON输出,想要解析其中的replicas(副本数)属性,但运行代码时抛出错误:TypeError: item.spec.map is not a function。以下是相关信息:
Kubectl返回的JSON结构
{ "apiVersion": "v1", "items": [ { "apiVersion": "extensions/v1beta1", "kind": "Deployment", "metadata": { "labels": { "env": "stage" }, "name": "sl-deployment" }, "spec": { "progressDeadlineSeconds": 2147483647, "replicas": 3, "revisionHistoryLimit": 3, "selector": { "matchLabels": { "env": "nonprod", "microservice": "svc-microservice", "name": "sl-deployment" } }, "strategy": { "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 1 }, "type": "RollingUpdate" }, "template": { "metadata": { "labels": { "env": "stage", "microservice": "svc-microservice", "name": "sl-deployment" } }, "spec": { "containers": [ { "image": "myregistry/svc-microservice/sl-deployment:stage.4.30", "name": "sl-deployment", "resources": { "limits": { "cpu": "6", "memory": "16Gi" }, "requests": { "cpu": "2", "memory": "6Gi" } } } ] } } } }] }
我的Node.js代码
exec(`kubectl get deployment -n svc-microservice -o json`, (error, stdout, stderr) => { if (error) { console.log(`error: ${error.message}`); return; } if (stderr) { console.log(`stderr: ${stderr}`); return; } var deployjson = JSON.parse(stdout); for (let item of deployjson.items) { var deploymentInfo = item.spec.map((c) => { return { replicas: c.replicas} }); for (let info of deploymentInfo) { metadata[name][info.name] = { deployment:info.replicas} } } })
错误信息
var deploymentInfo = item.spec.map((c) => { return { replicas: c.replicas} }); ^ TypeError: item.spec.map is not a function
错误原因
item.spec是对象类型(从JSON结构可见,每个Deployment的spec是包含replicas等字段的单个对象),而map()是数组专属方法,只能用于数组实例,直接调用item.spec.map()自然会报错。你混淆了spec的结构——spec本身不是数组,只有其内部的containers是数组,但你要获取的replicas是spec对象的直接属性。
修正后的代码
const { exec } = require('child_process'); exec(`kubectl get deployment -n svc-microservice -o json`, (error, stdout, stderr) => { if (error) { console.log(`error: ${error.message}`); return; } if (stderr) { console.log(`stderr: ${stderr}`); return; } const deployjson = JSON.parse(stdout); // 初始化metadata对象,根据实际业务调整name的值 const metadata = {}; const name = 'deployment-info'; metadata[name] = metadata[name] || {}; for (const item of deployjson.items) { // 直接从spec对象读取replicas,同时获取Deployment名称 const deploymentName = item.metadata.name; const replicasCount = item.spec.replicas; metadata[name][deploymentName] = { deployment: replicasCount }; } console.log('解析结果:', metadata); });
修正说明
- 移除错误的
item.spec.map()调用,直接访问item.spec.replicas获取副本数 - 补充了
metadata和name的初始化逻辑(原代码中这两个变量未定义,会引发新的ReferenceError) - 通过
item.metadata.name获取Deployment的名称,确保存入metadata的键值对对应正确的资源
内容的提问来源于stack exchange,提问作者UAB_SRR
相关产品推荐
相关产品推荐

