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
相关产品推荐
相关产品推荐

