NodeJS使用MongoDB时如何获取异步函数外的数据以提取用户邮箱
解决方案
你可以通过两种方式实现需求:
方法1:自定义forEach回调收集邮箱
将cursor.forEach(console.dir)替换为自定义回调函数,在回调中收集用户邮箱,同时将run函数改为返回收集到的邮箱列表,方便外部调用:
const client = new MongoClient(url); async function run() { // 定义数组存储所有用户邮箱 const emailList = []; try { await client.connect(); const database = client.db(dbMongo); const users = database.collection("users"); const cursor = users.find(); if ((await cursor.count()) === 0) { console.log("No documents found!"); return emailList; } // 替换console.dir为自定义回调,逐个把邮箱存入数组 await cursor.forEach(user => { // 假设用户集合里邮箱字段为email,根据实际字段名修改 if (user.email) emailList.push(user.email); }); return emailList; } finally { await client.close(); } } // 外部获取数据的两种方式: // 方式1:await调用(需要放在async函数内) // const recipients = await run(); // 方式2:用.then获取异步结果 run().then(recipients => { // 在这里可以遍历使用recipients邮箱列表 console.log(recipients); }).catch(console.dir);
方法2:直接将游标转为数组操作
如果不需要逐个处理大体积文档,更简单的方式是用toArray()直接把查询结果转为数组,后续遍历操作更灵活:
const client = new MongoClient(url); async function run() { try { await client.connect(); const database = client.db(dbMongo); const users = database.collection("users"); const userList = await users.find().toArray(); if (userList.length === 0) { console.log("No documents found!"); return []; } // 直接遍历数组提取邮箱 return userList.map(user => user.email).filter(Boolean); } finally { await client.close(); } } run().then(recipients => { console.log(recipients); }).catch(console.dir);
注意事项
- 不要用全局变量存储异步获取的数据,必须在
.then回调或者await语句之后访问数据,否则会拿到未赋值的空值 - 代码中的邮箱字段名
email需要和你实际MongoDB集合里的字段名保持一致
内容的提问来源于stack exchange,提问作者Scamus
相关产品推荐
相关产品推荐

