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

Node.js中Promise.all合并函数返回值生成双CSV附件邮件问题

修复Promise.all与多CSV附件邮件发送问题

我来帮你梳理下代码里的问题,然后一步步修复:

核心问题分析

  1. Promise.all后的then链语法错误:你在Promise.all(arr).then(values => { ... })里直接嵌套.then,这是语法错误,而且没正确解构Promise.all返回的两个并行结果(电影数据和女演员数据)。
  2. 邮件函数仅支持单个CSV附件:原sendEmailWithCSVExtract只能处理一个CSV,没法满足你添加两个独立附件的需求。
  3. 缺失错误处理逻辑:整个Promise链没有catch块,一旦某个环节出错,你无法捕获和处理异常。

修复后的完整代码

1. 修正Promise.all调用逻辑

// 并行触发两个Promise请求
Promise.all([
  dbGetMovies.getMoviesForCSVExport(search, serviceType, status),
  dbGetMovies.getActressesForCSVExport(search, serviceType, status)
])
// 解构两个返回结果,分别转换为CSV格式
.then(([moviesData, actressesData]) => {
  // 生成电影数据的CSV
  const moviesCSV = json2csv({ 
    data: moviesData, 
    fields: dbGetMovies.WHITE_LISTED_CONTRACTOR_FIELDS 
  });
  // 生成女演员数据的CSV(如果字段不同,替换成对应的字段集合即可)
  const actressesCSV = json2csv({ 
    data: actressesData, 
    fields: dbGetMovies.WHITE_LISTED_CONTRACTOR_FIELDS 
  });
  return { moviesCSV, actressesCSV };
})
// 调用修改后的邮件发送函数,传入两个CSV内容
.then(({ moviesCSV, actressesCSV }) => 
  emails.sendEmailWithCSVExtract(moviesCSV, actressesCSV, tokenPayload.email)
)
// 设置成功响应状态码
.then(() => response.setStatusCode(204))
// 捕获所有环节的异常并处理
.catch(err => {
  console.error('CSV导出或邮件发送失败:', err);
  response.setStatusCode(500);
  // 可根据业务需求返回错误信息
});

2. 修改sendEmailWithCSVExtract函数以支持双附件

function sendEmailWithCSVExtract(
  moviesCSV /* :string */,
  actressesCSV /* :string */,
  emailAddress /* :string */
) /* :Promise<any> */ {
  return getTemplate('./templates/contractor-export.txt')
    .then((template) => mustache.render(template.toString(), {
      date: moment.utc().add(1, 'days').format('dddd, MMMM Do YYYY')
    }))
    .then((messageHtml) => {
      const transporter = nodemailer.createTransport({
        SES: new AWS.SES({ region: 'us-east-1' })
      });
      // 用Promise封装sendMail,避免回调嵌套
      return new Promise((resolve, reject) => {
        transporter.sendMail({
          from: env('SENDER_EMAIL'),
          to: emailAddress,
          subject: 'CSV Extract Data',
          text: messageHtml,
          attachments: [
            {
              filename: 'movies-extract.csv',
              content: moviesCSV
            },
            {
              filename: 'actresses-extract.csv',
              content: actressesCSV
            }
          ]
        }, (err, info) => {
          if (err) {
            console.error('发送CSV邮件失败:', err);
            reject(err);
          } else {
            console.log(`CSV提取邮件已发送至: ${emailAddress} (AWS SES MessageId = ${info.messageId})`);
            resolve(info);
          }
        });
      });
    });
}

关键修复点说明

  • 解构并行结果:使用([moviesData, actressesData])直接获取两个Promise的返回值,比数组索引访问更清晰。
  • 独立生成CSV:对两类数据分别调用json2csv生成对应的CSV内容,确保数据独立性。
  • 扩展邮件函数:让函数接收两个CSV参数,并在attachments数组中添加两个命名不同的附件,方便收件人区分。
  • 添加错误捕获:通过catch块处理整个流程中的异常,避免静默失败,同时返回合适的HTTP状态码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:32:30