You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node-RED中Postgrestor写入PostgreSQL报JSON语法错误排查请求

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 20:54:59