如何从Promise中获取数组值?Sendgrid多附件发送代码问题排查
你代码的核心问题
- 异步时序错误:
fs.readFile是异步回调类API,调用后不会立刻执行回调逻辑,你遍历结束后直接调用resolve(emailAttachments)时,所有文件读取操作还未完成,返回的永远是空数组。 - 错误处理失效:文件读取错误回调中的
return { handled: false }仅作用于回调函数本身,既不会终止流程也不会触发外层Promise的reject,报错时你无法感知。 - 无异步等待逻辑:没有监听所有文件读取任务的完成状态,无法保证3个附件全部被推入数组后再返回结果。
修复后的实现方案
推荐改用Promise版本的fs接口搭配Promise.all实现需求,不需要手动维护结果数组,代码更简洁可控:
// 优先使用Node原生提供的promise化fs接口 const fs = require('fs').promises; return Promise.all(pdfList.map(async (item) => { try { const data = await fs.readFile(item.frDoc); return { content: data.toString('base64'), // 建议此处修改为唯一文件名,避免3个附件重名被覆盖 filename: `document.pdf`, type: 'application/pdf', disposition: 'attachment' }; } catch (err) { // 可根据业务需求选择抛出错误中断流程,或者返回自定义结构 throw new Error(`文件读取失败:${err.message}`); } }));
Promise.all会等待所有文件读取任务完成后,按遍历顺序返回你需要的3个对象组成的数组,任意任务报错都会直接抛出异常,方便上层捕获处理。
内容的提问来源于stack exchange,提问作者taurOan
相关产品推荐
相关产品推荐

