Node.js异步调用PostgreSQL数据库时如何正确存储返回值
问题原因与解决方案
核心问题
你遇到的returnedOrders为undefined的问题本质是异步逻辑和async/await语法使用不规范:
- 调用
await的insertOrder函数未声明async,不符合async/await语法要求 connectToDB、retrieveAllOrders两个函数未返回内部异步操作的Promise对象,外部await无法捕获异步执行状态,导致还没等查询完成就已经执行了后续赋值操作- 未等待数据库连接完成就直接发起查询,逻辑时序错误
修改后的代码
// 调用处需要加async标记,才能在内部使用await async function insertOrder() { // 先等待数据库连接完成,再执行后续查询操作 await dbConnector.connectToDB(); const returnedOrders = await dbConnector.retrieveAllOrders(); console.log("The returned orders" , returnedOrders); } function connectToDB() { // 直接返回内部的Promise对象,外部才能用await等待执行完成 return conn.connect().then((success, error) => { if(error) { console.log(`There was an error connecting because: ${error}`); // 出错时抛出错误,方便上层逻辑捕获处理 throw error; }else { console.log(`Successfully connected to the database: ${success}`); return success; } }); } function retrieveAllOrders(){ const query = `SELECT * from food.pizza`; // 返回query的Promise对象 return conn.query(query).then((results, error) => { if(error) { console.log(`There was an error due to: ${error}`); throw error; } console.log("Successfully connected. Running first query"); console.log(`Results are: ${JSON.stringify(results.rows[0], null , 2)}}`) conn.end(); return results; }) .catch((error) => { console.log(`Unable to retrieve query due to: ${error.message}`) throw error; }) }
额外优化建议
- 可以将数据库连接、查询的错误统一用
try/catch包裹在insertOrder中处理,避免错误抛到全局 - 如果需要频繁发起查询,不要每次查询完都调用
conn.end()关闭连接,建议使用连接池管理数据库连接,性能更高
内容的提问来源于stack exchange,提问作者Mohamed Ali
相关产品推荐
相关产品推荐

