Node-RED函数节点if条件null值判断失效问题排查
问题拆解与修正方案
咱们来一步步揪出你代码里的问题,其实就是两个容易忽略的JavaScript细节:
1. key被赋值成了数组,不是单个键名
Object.keys(res[0])返回的是包含所有键名的数组,哪怕你的对象只有一个pressure键,它返回的也是["pressure"],而不是字符串"pressure"。你直接把这个数组赋值给key,后续用它操作的时候自然会出问题。
赶紧把这行改成取数组的第一个元素:
key = Object.keys(res[0])[0]; // 这样key就变成了"pressure"这个字符串
2. 多余的双层数组包裹[[key]]
你写的res[0][[key]]是把key又套了一层数组当属性键,这完全是画蛇添足:
- 如果
key还是数组(没改之前),[[key]]就是个二维数组,JavaScript会把它强制转成字符串当键用。这时候你访问的其实是res[0]["[object Object]"](或者其他奇怪的字符串),得到的结果是undefined。而在JS里undefined != null的结果是true,这就解释了为什么不管pressure是不是null,都会跑进if语句里。 - 就算
key已经改成了单个字符串,[[key]]也是多余的数组包裹,虽然最终能访问到正确属性,但写法非常混淆。
正确的访问方式应该直接用key:
if(res[0][key] !== null) { // 建议用严格不等!==,避免隐式类型转换的坑 console.log(`res: ${key}:${res[0][key]}`); // 用模板字符串输出更清晰 }
修正后的完整代码
res = dataTransform.transform(); // 关键场景:res = [{"pressure":null}]; const key = Object.keys(res[0])[0]; if(res[0][key] !== null) { console.log(`res: ${key}:${res[0][key]}`); } else { console.log(`res: ${key} is null`); }
为什么控制台输出res: 0:[object Object]?
没改之前,key是数组["pressure"],你写的[key]是把这个数组又套了一层,变成[["pressure"]]。和字符串拼接时,数组会调用toString()转成字符串,但如果你的数据结构或者key的取值和预期有偏差(比如res[0]的键是数字0),就会出现这种奇怪的输出。修正key的取值和访问方式后,这个问题就会消失啦。
内容的提问来源于stack exchange,提问作者Gianluca Petralia
相关产品推荐
相关产品推荐

