You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Firestore快照生成文件下载链接时响应数组为空如何解决

问题根因

  • forEach 方法不支持异步等待,你在forEach中传入的async函数只会生成一堆未等待的Promise,外层的await实际上等的是forEach返回的undefined,根本不会等所有下载任务执行完成
  • res.send 写在了docRef.get()异步逻辑的外层,还没等数据库查询、文件下载、数组填充的逻辑跑完,就已经把空的attachmentList返回给前端了

修复后的代码

try {
  const snapshot = await docRef.get()
  // 将每个文档的处理逻辑映射为Promise数组
  const attachmentPromises = snapshot.docs.map(async (attachment: any) => {
    const urls = await downloadFile(attachment.data()["paths"])
    return {
      "id": attachment.id,
      "created_at": attachment.data()["created_at"],
      "paths": urls,
      "content_types": attachment.data()["content_types"]
    }
  })
  // 等待所有下载任务完成,直接获取填充完成的数组
  const attachmentList = await Promise.all(attachmentPromises)
  res.send({
    "code": "ok",
    "message": attachmentList
  })
} catch (error) {
  res.status(400).send({
    "code": "ERROR",
    "message": error
  })
}

补充说明

  • 用map代替forEach生成异步任务数组,Promise.all会等待所有异步任务执行完成后统一返回结果,不会出现数据丢失的情况
  • 把返回逻辑放到所有异步操作执行完成之后,确保返回的数组已经填充完全
  • 统一用try/catch捕获所有异步链路的异常,逻辑更清晰,避免出现部分异常已经返回响应后还重复调用res.send的问题

内容的提问来源于stack exchange,提问作者Fernando

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:09:01