向PostgreSQL jsonb字段推送对象的格式问题求助
解决PostgreSQL jsonb字段接收对象数组的格式问题
核心问题分析
你当前的写法存在两个关键问题:
- 直接用模板字符串拼接
req.body.warehouses时,JS对象的键名(Name、Table)不会带上双引号,不符合JSON规范,导致PostgreSQL的::jsonb类型转换失败。 - 直接拼接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
相关产品推荐
相关产品推荐

