Express/Node+PostgreSQL环境下Postman无法获取POST请求响应
问题原因与解决方案
嘿,我立刻发现了你代码里的关键问题,这也是导致Postman超时、无法打印results的根本原因:
1. 回调函数的位置错误
你在调用pool.query时,错误地提前闭合了函数括号,还加了个多余的逗号,导致回调函数根本没有被作为参数传入pool.query中。原代码里的这部分:
pool.query(`INSERT INTO events (...) VALUES (...)`), (error, results) => { // 回调逻辑 }
实际上是把pool.query的调用和一个独立的箭头函数分开了,数据库操作完成后根本不会触发这个回调,自然也就不会执行response.status(201).send(...),Postman就会一直等待响应直到超时,results也永远不会被打印。
2. 修复后的代码(同时解决SQL注入风险)
另外还要提醒你:直接用字符串拼接用户输入到SQL语句里存在严重的SQL注入风险,必须使用pg包支持的参数化查询来避免这个问题。下面是修复后的完整代码:
const createEvent = (request, response) => { console.log(request.body); const { type, location, current_attendees, total_attendees, details, event_date, has_car, has_food, cover_charge, contact_email } = request.body; // 使用参数化查询,用$1、$2...占位符代替直接拼接 const query = ` INSERT INTO events (type, location, current_attendees, total_attendees, details, event_date, has_car, has_food, cover_charge, contact_email) VALUES ($1, $2, $3, $4, $5, TO_DATE($6, 'YYYY-MM-DD'), $7, $8, $9, $10) `; const values = [type, location, current_attendees, total_attendees, details, event_date, has_car, has_food, cover_charge, contact_email]; // 正确传入回调函数作为pool.query的第三个参数 pool.query(query, values, (error, results) => { if (error) { // 建议不要直接throw error,避免服务器崩溃,返回错误响应给客户端 console.error(error); return response.status(500).send('Failed to create event'); } console.log(results); response.status(201).send('Event created'); }); }
3. 额外优化建议
- 不要直接
throw error,在Express中这样会导致服务器崩溃,应该捕获错误并返回合适的HTTP错误响应给客户端。 - 可以考虑使用async/await语法替代回调,让代码更易读:
const createEvent = async (request, response) => { try { console.log(request.body); const { type, location, current_attendees, total_attendees, details, event_date, has_car, has_food, cover_charge, contact_email } = request.body; const query = ` INSERT INTO events (type, location, current_attendees, total_attendees, details, event_date, has_car, has_food, cover_charge, contact_email) VALUES ($1, $2, $3, $4, $5, TO_DATE($6, 'YYYY-MM-DD'), $7, $8, $9, $10) `; const values = [type, location, current_attendees, total_attendees, details, event_date, has_car, has_food, cover_charge, contact_email]; const results = await pool.query(query, values); console.log(results); response.status(201).send('Event created'); } catch (error) { console.error(error); response.status(500).send('Failed to create event'); } }
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

