如何在Node-RED的JS函数中编写含对象的JSON列表并消除undefined
Node-RED调试输出出现undefined问题解决
问题描述
调试面板输出存在undefined,期望得到无undefined的单一输出,基于Node-RED开发。
相关截图
- 调试面板输出:

- Node-RED流程图:

当前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": [] }]
问题原因
- 消息重复触发:每个Inject节点同时连接
file in和Set Data,导致Set Data收到两份消息:一份是Inject的有效payload(含kinput/kinout),另一份是file in返回的内容(若文件不存在/为空,payload无kinput/kinout属性,会直接返回undefined)。 - 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
相关产品推荐
相关产品推荐

