NodeRED可视化流构建器中JavaScript代码失效问题排查
NodeRED函数节点未正确处理布尔值判断问题解决
问题背景
输入的msg.payload数据结构:
var msg = { payload: { Dryblend_Dose_Finished: true, // 动态布尔值 Filler_Dose_Finished: true, Weight_Sent_DryBlend: 100, // 动态数值 Weight_Sent_Filler: 50 } };
需求:当Dryblend_Dose_Finished和Filler_Dose_Finished均为true时,将两个重量值相加,结果存入payload的新属性中。
用户编写的函数代码:
// Bring in the payload var array = msg.payload; // Check to see if the BOOLs are both TRUE if (array.Dryblend_Dose_Finished === "true" && array.Filler_Dose_Finished === "true") { //add the 2 weights together and store for incorporation into the outgoing msg.payload array.total = array.Weight_Sent_DryBlend + array.Weight_Sent_Filler; } else { array.didntWork = 1; } // put everything back into the payload msg.payload = array; return msg;
问题现象:执行后调试节点输出与输入完全一致,既没有新增total属性,也没有出现else分支的didntWork属性,仅显示函数执行完成。
问题原因
- 类型不匹配导致判断失效:输入中的两个状态值是布尔类型的
true,但代码中用严格相等运算符===和字符串"true"做比较。===会同时校验值和类型,布尔值true与字符串"true"类型完全不同,因此判断条件永远不成立。 - 变量命名混淆:将
msg.payload赋值给名为array的变量,但payload是对象而非数组,虽不影响功能,但易造成逻辑误解。
解决方法
修正核心判断逻辑
把判断条件中的字符串"true"改为布尔值true,匹配数据的实际类型:
var payload = msg.payload; // 修正布尔值判断逻辑 if (payload.Dryblend_Dose_Finished === true && payload.Filler_Dose_Finished === true) { payload.total = payload.Weight_Sent_DryBlend + payload.Weight_Sent_Filler; } else { payload.didntWork = 1; } return msg;
简化优化(可选)
布尔值本身可直接作为判断条件,无需额外的相等校验,代码可简化为:
var payload = msg.payload; if (payload.Dryblend_Dose_Finished && payload.Filler_Dose_Finished) { payload.total = payload.Weight_Sent_DryBlend + payload.Weight_Sent_Filler; } else { payload.didntWork = 1; } return msg;
注:由于msg.payload是对象引用,修改payload变量会直接同步修改原msg.payload,因此可以省略msg.payload = payload这一步,直接返回msg即可。
内容的提问来源于stack exchange,提问作者Jeff Hoagland
相关产品推荐
相关产品推荐

