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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:18:04