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

Nuxt3 Server Event未等待Nodemailer发送邮件即返回结果问题

Nuxt3 Server Event无法等待邮件发送完成返回结果的问题解决

你的核心问题是**mailTransport.sendMail是基于回调的异步方法,直接用await无法等待它执行完成**。当你传入回调函数时,sendMail不会返回Promise,await相当于无效,代码会直接跳过这部分继续执行,导致send变量为undefined,最后走到return {}返回空对象。

修复方案:将回调式sendMail包装为Promise

把sendMail的回调逻辑封装成Promise,这样就能用await等待邮件发送完成,再返回结果:

export default defineEventHandler(async (event) => {

  const mailOptions = {
    from: `myemail`,
    to: ['myemail'],
    bcc: ['myemail']
  };

  const body = await readBody(event)

  const email = EmailValidator.validate(body.email);

  if(!email) {
    throw createError({
      statusCode: 400,
      statusMessage: 'Please input a valid email',
    })
  }

  if(body.name.length < 4) {
    throw createError({
      statusCode: 400,
      statusMessage: 'Please input a valid name',
    })
  }

  if(body.message.length < 16) {
    throw createError({
      statusCode: 400,
      statusMessage: 'Please input a valid message',
    })
  }

  mailOptions.subject = 'XX - Web Enquiry'
  mailOptions.html =   `
    <h5>We have received a enquiry through XX website:</h5>
    <p>Name: ${body.name}</p>
    <p>Email: ${body.email}</p>
    <p>Message: ${body.message}</p>
  `;
  
  // 包装为Promise,等待邮件发送完成
  const sendResult = await new Promise((resolve) => {
    mailTransport.sendMail(mailOptions, (err, info) => {
      if(!err) {
        resolve({
          success: true,
          e: ''
        })
      } else {
        resolve({
          success: false,
          e: 'Something went wrong'
        })
      }
    })
  })

  return sendResult
})

额外优化说明

  • 如果你使用的是nodemailer这类常见邮件库,它本身支持Promise调用:只要不传入回调函数,sendMail就会返回一个Promise,无需手动包装,直接用try/catch处理即可:
    try {
      await mailTransport.sendMail(mailOptions);
      return { success: true, e: '' };
    } catch (err) {
      return { success: false, e: 'Something went wrong' };
    }
    
  • 之前尝试setResponseStatus(event, 202)报错,是因为异步等待逻辑失效导致代码提前执行到后续逻辑,状态被重复设置引发冲突。修复异步等待逻辑后,就可以正常使用setResponseStatus设置响应状态码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:12:27