问题描述
我正在执行一个简单的HTTP GET请求
并且假设function
仅包含return msg;
的响应是一个字典,例如:
{
"data": [{
"time": "2020-10-01","value": 998.37
}],"id": "27","tags": []
}
现在我只想提取值本身。我怎样才能做到这一点?
如果尝试使用return msg['data']['value'];
,则会收到TypeError TypeError: Cannot read property 'value' of undefined
。
编辑:我尝试使用Pogrindis方法,但是在Node-RED流文件中苦苦挣扎。
我的Node-RED接口的JSON非常简单,该函数是单行的
return (msg.payload)['data'][0]['value'];
:
[{
"id": "cda42b56.ad2258","type": "tab","label": "Test","disabled": false,"info": ""
},{
"id": "95fa7937.aa8e48","type": "debug","z": "cda42b56.ad2258","name": "Logger","active": true,"tosidebar": true,"console": true,"tostatus": false,"complete": "payload","targettype": "msg","statusVal": "","statusType": "auto","x": 480,"y": 80,"wires": []
},{
"id": "200acc6f.e2ff54","type": "function","name": "","func": "return (msg.payload)['data'][0]['value'];\n","outputs": 1,"noerr": 0,"initialize": "","finalize": "","x": 300,"wires": [
["95fa7937.aa8e48"]
]
},{
"id": "831bfe43.3d956","type": "inject","props": [{
"p": "payload"
}],"repeat": "","crontab": "","once": false,"onceDelay": 0.1,"topic": "","payload": "{\"data\":[{\"time\":\"2020\",\"value\":997.62}],\"id\":\"xy123\"}","payloadType": "str","x": 120,"wires": [
["200acc6f.e2ff54"]
]
}]
解决方法
data
是一个数组,值不是该数组的索引。
您可以为我猜到的数据使用索引
const testData = {
"data": [{
"time": "2020-10-01","value": 998.37
}],"id": "27","tags": []
};
console.log(testData['data'][0]['value']);
我说我想是因为有N个数据,使用某种迭代器/过滤器等可能会更好,但我不知道您的用例。
,要记住的重要一点是,“功能”节点必须始终返回msg
对象,而不是单个值。
该错误来自调试节点(如果将鼠标悬停在边栏中的错误上,它将显示错误源于哪个节点),因为您返回的是原始值而不是msg
对象。
您的函数仅返回一个数字,这将不起作用。
该功能应显示为:
msg.payload = msg.payload.data.[0].value;
return msg;
有关编写函数节点的文档可以找到here
,您所提供的流程表明您正在发送文本,而不是JSON对象。
应将其更改为JSON选项。另外,您可以在功能节点中使用JSON.parse()方法。
红色节点通过JSON对象进行通信,因此函数的输出也必须是JSON对象。
return {"value" : msg.payload.data[0].value}
或者,如果数据列表的长度是动态的,则可以使用
return {"values" : msg.payload.data.map(object => object.value)}