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

向PostgreSQL jsonb字段推送对象的格式问题求助

解决PostgreSQL jsonb字段接收对象数组的格式问题

核心问题分析

你当前的写法存在两个关键问题:

  1. 直接用模板字符串拼接req.body.warehouses时,JS对象的键名(Name、Table)不会带上双引号,不符合JSON规范,导致PostgreSQL的::jsonb类型转换失败。
  2. 直接拼接SQL参数存在严重的SQL注入风险,可能导致数据库被恶意攻击。

解决步骤

1. 将JS对象数组转为标准JSON字符串

使用JSON.stringify()把前端传入的warehouses数组转为严格符合JSON规范的字符串,这样键名会自动添加双引号,刚好满足PostgreSQL jsonb的格式要求。

2. 使用参数化查询(必做)

绝对不要用模板字符串直接拼接SQL语句,改用数据库驱动支持的参数化查询——既可以自动处理类型转换,又能彻底避免SQL注入风险。


代码示例(以node-postgres库为例)

const { Pool } = require('pg');
const pool = new Pool({
  // 填入你的数据库配置:host、port、database、user、password等
});

async function updateUserWarehouse(req, res) {
  try {
    // 把JS数组转为标准JSON字符串
    const warehouseJson = JSON.stringify(req.body.warehouses);
    const dodId = req.body.DoD;

    // 参数化查询:用$1、$2作为占位符,参数放在数组中传入
    const updateQuery = `
      UPDATE users 
      SET warehouse_access = $1::jsonb 
      WHERE dod_id = $2
    `;
    const result = await pool.query(updateQuery, [warehouseJson, dodId]);

    res.status(200).json({
      success: true,
      updatedRows: result.rowCount
    });
  } catch (error) {
    console.error('更新失败:', error);
    res.status(500).json({ error: '服务器内部错误' });
  }
}

补充说明

  • 如果你使用ORM(比如Sequelize、Prisma),可以直接传入JS对象数组,ORM会自动处理JSON序列化和参数化查询,无需手动调用JSON.stringify()。
  • 前端用Axios发送请求时,确保请求头Content-Type为application/json,Axios默认会自动把JS对象转为JSON格式发送,后端通过express.json()中间件即可解析出req.body.warehouses数组。

内容的提问来源于stack exchange,提问作者yurikgarcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:41:17