使用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
相关产品推荐
相关产品推荐

