如何解构JavaScript中Promise包裹的数组?Node.js实战求助
解决async函数返回Promise无法直接使用数组方法的问题
问题原因
async 函数的特性就是无论返回什么值,都会自动被包装成 Promise 对象。你直接把 requestData() 的返回值赋值给 users.table,本质上是把一个 Promise 存了进去,而不是实际的用户数组,所以调用 forEach 等数组方法自然无效。
另外你的代码里有个小错误:client.end 是函数,需要加括号调用 client.end(),否则数据库连接不会关闭。
解决方案
根据你的模块类型(CommonJS/ES模块),可以选择以下方式:
方式1:导入时通过 await 获取实际数据(CommonJS 通用)
因为 CommonJS 不支持顶层 await,需要把导入和数据处理放在 async 函数里:
// 导入并处理数据的文件 async function processAdminData() { const adminData = require("./data/adminDataObjects"); // 等待 Promise 完成,拿到实际的用户数组 const userList = await adminData.users.table; // 现在可以正常使用数组方法 userList.forEach(user => { console.log(`${user.fName} ${user.lName}`); }); } processAdminData();
方式2:使用 ES 模块的顶层 await(Node.js 14.8+ 支持)
先在 package.json 中添加 "type": "module",然后修改你的数据文件:
// adminDataObjects.js async function requestData() { const selectQuery = `SELECT "fName", "lName", "phoneNumber", "eMail" FROM public."User"`; const {rows} = await client.query(selectQuery); client.end(); // 修复调用问题 return rows; } // 顶层 await 直接获取数组 const userTableData = await requestData(); export const users = { body: ``, table: userTableData, // 这里直接是实际数组 script: `<script>document.querySelector('.users').classList.add('active')</script>`, };
导入时就可以直接使用数组:
import { users } from "./data/adminDataObjects.js"; console.log(users.table); // 输出用户数组 users.table.forEach(user => console.log(user.eMail));
方式3:通过 .then() 处理 Promise(兼容所有场景)
如果不想用 async/await,也可以用 Promise 的 .then() 方法获取结果:
const adminData = require("./data/adminDataObjects"); adminData.users.table.then(userList => { userList.forEach(user => console.log(user.phoneNumber)); });
关键提示
- 永远记住:
async函数的返回值一定是 Promise,必须通过await或.then()才能拿到内部的实际值。 - 不要在数据库操作完成后忘记关闭连接,
client.end()一定要调用,否则会造成连接泄漏。
内容的提问来源于stack exchange,提问作者Dirghayu Joshi
相关产品推荐
相关产品推荐

