Node.js中Promise.all合并函数返回值生成双CSV附件邮件问题
修复Promise.all与多CSV附件邮件发送问题
我来帮你梳理下代码里的问题,然后一步步修复:
核心问题分析
- Promise.all后的then链语法错误:你在
Promise.all(arr).then(values => { ... })里直接嵌套.then,这是语法错误,而且没正确解构Promise.all返回的两个并行结果(电影数据和女演员数据)。 - 邮件函数仅支持单个CSV附件:原
sendEmailWithCSVExtract只能处理一个CSV,没法满足你添加两个独立附件的需求。 - 缺失错误处理逻辑:整个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
相关产品推荐
相关产品推荐

