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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:00:04