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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:15:44