ESP32+HC-SR04通过Node-RED存MQTT数据到MySQL遇错误,求解决
问题分析与解决
错误1:Function节点语法错误(SyntaxError: Unexpected identifier 'src')
问题出在两处:
- 变量赋值错误:Node-RED中必须通过
msg.payload获取消息负载,直接写payload会导致src变量未定义。 - SQL语句拼接错误:你用单引号包裹
src,导致它被识别为字符串字面量而非变量,同时单引号嵌套也触发了语法错误。
修正后的Function节点代码:
var src = msg.payload; // 用模板字符串拼接SQL msg.topic = `INSERT INTO transaction_log (distance,Timestamp) VALUES (${src}, CURTIME());`; return msg;
或者使用传统字符串拼接方式:
var src = msg.payload; msg.topic = "INSERT INTO transaction_log (distance,Timestamp) VALUES (" + src + ", CURTIME());"; return msg;
错误2:JSON节点解析错误(Unexpected end of JSON input)
ESP32发布的MQTT消息是纯数值字符串(如"19.18"),并非标准JSON格式,但流程中的JSON节点会尝试将输入解析为JSON对象,纯数值字符串不符合解析要求,因此报错。
解决方法二选一:
- 方案一:移除流程中的JSON节点,让MQTT输入的消息直接进入Function节点;
- 方案二:修改ESP32代码,发布JSON格式的消息:
// 替换原publish代码 char jsonBuffer[64]; snprintf(jsonBuffer, sizeof(jsonBuffer), "{\"distance\":%.2f}", distanceCm); client.publish("distance", jsonBuffer);
此时Function节点代码需对应调整为:
var src = msg.payload.distance; msg.topic = `INSERT INTO transaction_log (distance,Timestamp) VALUES (${src}, CURTIME());`; return msg;
内容的提问来源于stack exchange,提问作者agnanzakariya
相关产品推荐
相关产品推荐

