You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node-RED的JS函数中编写含对象的JSON列表并消除undefined

Node-RED调试输出出现undefined问题解决

问题描述

调试面板输出存在undefined,期望得到无undefined的单一输出,基于Node-RED开发。

相关截图

  • 调试面板输出:Debug-Tab output
  • Node-RED流程图:Node-Red Code

当前Set Data函数代码

var number1 = msg.payload.kinput
var number2 = msg.payload.kinout

var newlisencenumber = '{' + '"number1json"' + ':' + number1 +','+'"number2json"'+':'+ number2 +'}'

//-------------------------------------------------------------
var prepared = '{' + '"storage"' + ':' + '['+ newlisencenumber + ']' + '}'

//-------------------------------------------------------------
var msgout = prepared

msg.payload = msgout

return msg;

Node-RED流代码

[    {        "id": "b071a31b549f930b",        "type": "tab",        "label": "Flow 2",        "disabled": false,        "info": "",        "env": []    },    {        "id": "1b26b618f4eb0d4e",        "type": "inject",        "z": "b071a31b549f930b",        "name": "",        "props": [            {                "p": "payload.kinput",                "v": "\"A1234\"",                "vt": "str"            },            {                "p": "payload.kinout",                "v": "\"in\"",                "vt": "str"            }        ],        "repeat": "",        "crontab": "",        "once": false,        "onceDelay": 0.1,        "topic": "",        "x": 270,        "y": 300,        "wires": [            [                "45ab02267afb7af9",                "ede6741db6b1fc08"            ]        ]    },    {        "id": "ede6741db6b1fc08",        "type": "function",        "z": "b071a31b549f930b",        "name": "Set Data",        "func": "var number1 = msg.payload.kinput\nvar number2 = msg.payload.kinout\n\nvar newlisencenumber = '{' + '\"licensenumber\"' + ':' + number1 +','+'\"inout\"'+':'+ number2 +'}'\n\n//-------------------------------------------------------------\nvar prepared = '{' + '\"storage\"' + ':' + '['+ newlisencenumber + ']' + '}'\n\n//-------------------------------------------------------------\nvar msgout = prepared\n\n\n \n\n\nmsg.payload = msgout\n\nreturn msg;",        "outputs": 1,        "noerr": 0,        "initialize": "",        "finalize": "",        "libs": [],        "x": 840,        "y": 360,        "wires": [            [                "5cbe08fbd89b1b22"            ]        ]    },    {        "id": "77a032844ea6a095",        "type": "inject",        "z": "b071a31b549f930b",        "name": "",        "props": [            {                "p": "payload.kinput",                "v": "A1234",                "vt": "str"            },            {                "p": "payload.kinout",                "v": "out",                "vt": "str"            }        ],        "repeat": "",        "crontab": "",        "once": false,        "onceDelay": 0.1,        "topic": "",        "x": 270,        "y": 380,        "wires": [            [                "45ab02267afb7af9",                "ede6741db6b1fc08"            ]        ]    },    {        "id": "d8a6455136577088",        "type": "inject",        "z": "b071a31b549f930b",        "name": "",        "props": [            {                "p": "payload.kinput",                "v": "A4321",                "vt": "str"            },            {                "p": "payload.kinout",                "v": "in",                "vt": "str"            }        ],        "repeat": "",        "crontab": "",        "once": false,        "onceDelay": 0.1,        "topic": "",        "x": 270,        "y": 340,        "wires": [            [                "45ab02267afb7af9",                "ede6741db6b1fc08"            ]        ]    },    {        "id": "f6a8cc6165483098",        "type": "inject",        "z": "b071a31b549f930b",        "name": "",        "props": [            {                "p": "payload.kinput",                "v": "A4321",                "vt": "str"            },            {                "p": "payload.kinout",                "v": "out",                "vt": "str"            }        ],        "repeat": "",        "crontab": "",        "once": false,        "onceDelay": 0.1,        "topic": "",        "x": 270,        "y": 420,        "wires": [            [                "45ab02267afb7af9",                "ede6741db6b1fc08"            ]        ]    },    {        "id": "45ab02267afb7af9",        "type": "file in",        "z": "b071a31b549f930b",        "name": "",        "filename": "C:\\test\\test.json",        "filenameType": "str",        "format": "utf8",        "chunk": false,        "sendError": false,        "encoding": "none",        "allProps": false,        "x": 500,        "y": 360,        "wires": [            [                "ede6741db6b1fc08"            ]        ]    },    {        "id": "5cbe08fbd89b1b22",        "type": "debug",        "z": "b071a31b549f930b",        "name": "debug 6",        "active": true,        "tosidebar": true,        "console": false,        "tostatus": false,        "complete": "false",        "statusVal": "",        "statusType": "auto",        "x": 1020,        "y": 360,        "wires": []    }]

问题原因

  1. 消息重复触发:每个Inject节点同时连接file in和Set Data,导致Set Data收到两份消息:一份是Inject的有效payload(含kinput/kinout),另一份是file in返回的内容(若文件不存在/为空,payload无kinput/kinout属性,会直接返回undefined)。
  2. JSON拼接错误:手动拼接字符串生成JSON,一旦number1/number2未定义,会直接将undefined带入结果,还可能导致JSON格式非法。

解决方案

1. 修复消息流向

调整流结构,让Inject节点只连接file in,再由file in连接Set Data,确保Set Data只处理经过文件读取后的消息;或者在Set Data中过滤无效消息。

2. 正确生成JSON(推荐)

放弃手动字符串拼接,直接创建JS对象再转为JSON,同时添加数据校验:

// 校验必要属性是否存在,不存在则跳过该消息
if (!msg.payload?.kinput || !msg.payload?.kinout) {
    return null;
}

// 直接构造对象
const data = {
    storage: [
        {
            number1json: msg.payload.kinput,
            number2json: msg.payload.kinout
        }
    ]
};

// 转为JSON字符串
msg.payload = JSON.stringify(data);
return msg;

3. 结合文件数据的场景(若需要读取文件并追加数据)

如果要读取现有JSON文件并追加新数据,可使用以下代码:

let storage = [];

// 解析文件中的现有数据(若消息来自file in)
if (typeof msg.payload === 'string') {
    try {
        const fileData = JSON.parse(msg.payload);
        storage = fileData.storage || [];
    } catch (e) {
        // 文件解析失败,初始化空数组
        storage = [];
    }
}

// 获取输入的kinput和kinout数据
const kinput = msg.payload?.kinput || msg.kinput;
const kinout = msg.payload?.kinout || msg.kinout;

// 数据有效则追加
if (kinput && kinout) {
    storage.push({
        number1json: kinput,
        number2json: kinout
    });
}

// 生成最终JSON
msg.payload = JSON.stringify({ storage });
return msg;

内容的提问来源于stack exchange,提问作者Lema-1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:54:24