NestJS使用PdfMake+nodemailer时async/await无返回结果问题咨询
问题根因
当前接口返回空的核心原因是 pdfMake.createPdf().getBase64() 是回调式API,不支持原生async/await,直接await等待该方法的返回值实际拿到的是undefined,程序并没有等待内部的mailerService.sendMail()执行完成就提前返回,所以接口响应为空,后续邮件逻辑异步执行完成才能成功发送。
修复方案
首先调整mailService.ts的sendUserConfirmation方法,把回调逻辑包装为Promise,让异步流程可以被正确等待:
async sendUserConfirmation(emails: EmailList, data: emailData) { // 将回调形式的getBase64封装为Promise,拿到base64编码结果 const encodedString = await new Promise<string>((resolve) => { pdfMake .createPdf(this.prepareDoc(data)) .getBase64((encoded) => resolve(encoded)); }); const emailOptions = this.prepareEmail( emails, encodedString, data.docName, ); // 直接返回sendMail的执行结果,外层可以正确获取返回值 return this.mailerService.sendMail(emailOptions); }
controller层原有逻辑可正常运行,也可以调整为纯async/await写法,减少嵌套提升可读性:
@UseGuards(JwtAuthGuard) @Get('email') async sendEmail() { const emails = { receivers: ['jon@doe.com'], cc: ['jon@doe.com'], }; const data = await this.dataService.getData(); const sendResult = await this.mailService.sendUserConfirmation(emails, data); // 支持自定义响应结构,也可直接返回sendResult return { code: 200, message: '邮件发送成功', result: sendResult }; }
效果验证
修改后请求/email接口会等待邮件发送逻辑完全执行完成,再将mailerService.sendMail()的返回值响应给请求方,不会再出现返回空内容的问题。
内容的提问来源于stack exchange,提问作者mhld
相关产品推荐
相关产品推荐

