从字典中提取值在Node-RED中

问题描述

我正在执行一个简单的HTTP GET请求

enter image description here

并且假设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']);

JSFiddle

我说我想是因为有N个数据,使用某种迭代器/过滤器等可能会更好,但我不知道您的用例。

,

要记住的重要一点是,“功能”节点必须始终返回msg对象,而不是单个值。

该错误来自调试节点(如果将鼠标悬停在边栏中的错误上,它将显示错误源于哪个节点),因为您返回的是原始值而不是msg对象。

您的函数仅返回一个数字,这将不起作用。

该功能应显示为:

msg.payload = msg.payload.data.[0].value;
return msg;

有关编写函数节点的文档可以找到here

,

您所提供的流程表明您正在发送文本,而不是JSON对象。

Image of injecting node

应将其更改为JSON选项。另外,您可以在功能节点中使用JSON.parse()方法。

红色节点通过JSON对象进行通信,因此函数的输出也必须是JSON对象。

return {"value" : msg.payload.data[0].value}

或者,如果数据列表的长度是动态的,则可以使用

return {"values" : msg.payload.data.map(object => object.value)}