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

执行signUp函数返回undefined:PostgreSQL插入成功却无响应

问题原因

你的signUp函数虽然标记为async,但内部使用了回调式的client.query,函数本身没有返回任何Promise或值,所以await signUp(...)自然得到undefined。另外代码存在严重的SQL注入风险,必须修正。

解决方案

1. 改用Promise风格的数据库查询

PostgreSQL的客户端库(如pg)本身支持Promise,直接去掉回调,用await调用client.query即可。

2. 使用参数化查询避免SQL注入

绝对不能直接把用户输入拼进SQL字符串,要用$1、$2这类占位符传递参数。

3. 完善错误处理

用try/catch捕获数据库操作中的错误,统一返回错误响应。

修正后的代码
async function signUp(info) {
    const {
        firstName,
        lastName,
        address,
        email,
        phoneNumber,
        password,
        city,
        postal_code,
    } = info;

    console.log("only info: ", phoneNumber);

    // 参数化查询,用占位符替代直接拼接
    const queryInsertNewUser = `
        INSERT INTO public."Users"(
            "First_Name", "Email", "Mobile", "Address", "User_Type", "Last_Name", "password", "city", "postal_code"
        ) VALUES ($1, $2, $3, $4, 'Customer', $5, $6, $7, $8)
        RETURNING user_id;
    `;

    // 用await调用client.query,返回Promise
    try {
        const result = await client.query(queryInsertNewUser, [
            firstName, email, phoneNumber, address, lastName, password, city, postal_code
        ]);
        
        if (result.rowCount === 1) {
            console.log("User registered.");
            return {
                status: "Success",
                msg: "User Registered Successfully",
                user_id: result.rows[0].user_id,
            };
        } else {
            console.log("Not Registered.");
            return {
                status: "Error",
                msg: "Could not register user. Call Developer.",
            };
        }
    } catch (err) {
        console.log(err);
        return {
            status: "Error",
            msg: "Database operation failed",
            error: err.message
        };
    }
}

app.post("/signup", async(req, res) => {
    const data = await signUp(req.body);
    console.log(data);
    // 记得给客户端返回响应
    res.json(data);
});
关键说明
  • 去掉回调后,signUp函数通过await client.query等待数据库操作完成,并返回对应的结果对象,await signUp(...)就能拿到正确的值。
  • 参数化查询不仅安全,还能避免字符串转义的问题(比如用户输入含单引号会导致SQL语法错误)。
  • 添加try/catch后,数据库操作的错误能被捕获并返回统一格式的错误响应,避免程序崩溃。

内容的提问来源于stack exchange,提问作者Excellent Technologies BD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:55:14