【问题标题】:Extract values from dictionary (in Node-RED)从字典中提取值(在 Node-RED 中)
【发布时间】:2020-10-01 07:57:23
【问题描述】:

我正在发出一个简单的 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",
    "z": "cda42b56.ad2258",
    "name": "",
    "func": "return (msg.payload)['data'][0]['value'];\n",
    "outputs": 1,
    "noerr": 0,
    "initialize": "",
    "finalize": "",
    "x": 300,
    "y": 80,
    "wires": [
        ["95fa7937.aa8e48"]
    ]
}, {
    "id": "831bfe43.3d956",
    "type": "inject",
    "z": "cda42b56.ad2258",
    "name": "",
    "props": [{
        "p": "payload"
    }],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": 0.1,
    "topic": "",
    "payload": "{\"data\":[{\"time\":\"2020\",\"value\":997.62}],\"id\":\"xy123\"}",
    "payloadType": "str",
    "x": 120,
    "y": 80,
    "wires": [
        ["200acc6f.e2ff54"]
    ]
}]

【问题讨论】:

    标签: javascript node-red


    【解决方案1】:

    data是一个数组,value不是该数组的索引。

    我猜你可以对数据使用索引

    const testData = {
        "data": [{
            "time": "2020-10-01",
            "value": 998.37
        }],
        "id": "27",
        "tags": []
    };
    
    console.log(testData['data'][0]['value']);
    

    JSFiddle

    我说我猜,因为有 N 个数据,你可能最好使用某种迭代器/过滤器等,但我不知道你的用例。

    【讨论】:

    • 感谢您的评论。您提供的解决方案在 javascript 中有效,但是,我认为我的问题主要在于 Node-RED 流文件格式。我编辑了我的原始帖子。
    【解决方案2】:

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

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

    你的函数只返回一个数字,这不起作用。

    函数应该是:

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

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

    【讨论】:

      【解决方案3】:

      您给出的流程表明您正在注入节点中发送文本,而不是 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)}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-02
        • 2017-08-08
        • 2013-06-09
        相关资源
        最近更新 更多