You need to enable JavaScript to run this app. NodeJS使用MongoDB时如何获取异步函数外的数据以提取用户邮箱
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 16:06:02