执行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
相关产品推荐
相关产品推荐

