Node-RED中Postgrestor写入PostgreSQL报JSON语法错误排查请求
核心问题分析
报错error: invalid input syntax for type json的本质是:Node-RED传递给Postgrestor节点的JSON数据不符合PostgreSQL的JSON类型语法规范。尽管pgAdmin中执行的查询语句正常,但Node-RED的数据传递逻辑、序列化方式与pgAdmin存在差异,导致格式校验失败。
排查步骤与解决方法
强制数据序列化为标准JSON字符串
PostgreSQL的JSON类型仅接受严格格式的JSON字符串,若Node-RED直接传递JavaScript对象,Postgrestor节点可能未自动完成序列化。在Postgrestor节点前添加Function节点,将数据转为标准JSON字符串:// 将JavaScript对象转为JSON字符串 msg.payload = JSON.stringify(msg.payload); return msg;修复MQTT数据的转义问题
MQTT接收的数据可能包含未转义的特殊字符(如双引号、反斜杠),pgAdmin执行时会自动处理,但Node-RED传递时会破坏JSON格式。通过先解析再重新序列化的方式修复:try { // 先解析MQTT原始字符串为对象,再重新生成标准JSON const parsedData = JSON.parse(msg.payload); msg.payload = JSON.stringify(parsedData); } catch (err) { node.error("MQTT数据解析失败: " + err.message); } return msg;核对Postgrestor节点的参数配置
若使用参数化查询,确保JSON字段对应的参数是字符串类型而非JavaScript对象。例如插入语句为:INSERT INTO sensor_data (payload) VALUES ($1)则
$1对应的msg.payload必须是JSON字符串,不能直接传入对象。对比Node-RED与pgAdmin的执行语句
在Function节点中打印实际执行的SQL语句和参数,与pgAdmin中的语句逐字符对比:// 输出调试信息到Node-RED控制台 node.debug("执行的SQL语句: " + msg.topic); node.debug("传递的参数: " + JSON.stringify(msg.payload));重点检查JSON部分的引号、括号是否完全一致,是否存在多余或缺失的字符。
确认PostgreSQL版本一致性
不同版本的PostgreSQL对JSON语法的校验严格度有差异,确保Node-RED连接的数据库版本与pgAdmin使用的版本一致,避免版本兼容问题。
内容的提问来源于stack exchange,提问作者Gnani Kim

