使用Express+TypeScript请求返回201但PostgreSQL未插入数据
问题分析:POST请求返回201但PostgreSQL未插入数据
发送POST请求创建新条目时,接口返回201状态码,但数据库无新增数据,响应内容为:
{ "message": {} }
相关代码
数据库连接代码
import { Pool } from "pg"; const myPool = new Pool({ host: `${process.env.DATABASE_URL}`, //somedb.abc.us-east-1.rds.amazonaws.com database: `${process.env.DATABASE_NAME}`, //dbName user: `${process.env.DATABASE_USER}`, //dbUser password: `${process.env.DATABASE_PASSWORD}`, //dbPassword port: 5432 }); myPool.connect();
POST路由代码
const router = express.Router(); router.post("/item/new", async (request, response) =>{ try{ const { itemTitle } = request.body; const myItem = await myPool.query(`INSERT INTO items VALUES('${itemTitle}')`), (resp, err) =>{ if(err){ return err; } return resp; }); return response.status(201).json({message: myItem}); }catch(err){ return response.status(400).json({message: `${err}`}); } });
错误原因及修复方案
1. myPool.query语法错误(await与回调混用)
代码同时混用了await和回调函数调用myPool.query,属于错误用法。pg的query方法使用await时会直接返回结果,无需附加回调;且代码存在语法错误(多余的逗号和错位的括号),导致插入逻辑根本没正确执行,又因未抛出错误,直接走到了返回201的分支。
2. SQL注入风险与参数化缺失
直接拼接itemTitle到SQL语句中,存在严重SQL注入风险,还可能因特殊字符导致语句执行失败。必须使用参数化查询。
3. 不必要的myPool.connect()调用
pg连接池会自动管理连接,手动调用connect()反而可能引发连接泄漏问题,应移除。
修复后的代码
数据库连接代码
import { Pool } from "pg"; const myPool = new Pool({ host: process.env.DATABASE_URL, database: process.env.DATABASE_NAME, user: process.env.DATABASE_USER, password: process.env.DATABASE_PASSWORD, port: 5432 }); // 移除myPool.connect()
POST路由代码
const router = express.Router(); router.post("/item/new", async (request, response) => { try { const { itemTitle } = request.body; // 使用参数化查询,添加RETURNING返回插入记录 const result = await myPool.query( 'INSERT INTO items (title) VALUES ($1) RETURNING *', [itemTitle] ); return response.status(201).json({ message: "插入成功", data: result.rows[0] }); } catch (err) { console.error(err); // 打印错误日志便于排查 return response.status(400).json({ message: `插入失败:${(err as Error).message}` }); } });
注意:将INSERT语句中的title替换为你items表的实际字段名;如果表只有一个字段,可省略字段名,但建议明确指定,避免后续表结构变更引发问题。
内容的提问来源于stack exchange,提问作者abc
相关产品推荐
相关产品推荐

