使用Nodemailer发邮件出现ERR_HTTP_HEADERS_SENT错误求助
错误原因及解决方法
错误原因
- 重复发送响应:代码里使用了
res.send(200).json(...),res.send(200)已经向客户端发送了完整响应(包含状态码和响应头),后续调用.json()会尝试再次设置响应头,触发Node.js的ERR_HTTP_HEADERS_SENT错误。 - 异步逻辑处理不规范:
transporter.sendMail是异步操作,当前代码会在触发邮件发送后立即返回响应,不管邮件是否发送成功,可能出现客户端收到“发送成功”提示但实际邮件发送失败的情况。
解决方法
1. 修正响应写法
把res.send(200).json(...)替换为res.status(200).json(...),res.status()仅设置响应状态码,不会立即结束响应,后续的.json()会发送完整的响应内容:
res.status(200).json({message:"Verification link has been sent to your email. Please verify your email"})
2. 正确处理异步邮件发送
推荐用async/await处理邮件发送的异步逻辑,确保邮件发送结果处理完成后再返回响应:
exports.create = async (req, res) => { // 检查用户是否已存在 let user = await Attendee.findOne({ email: req.body.email }); if (user) { return res .status(400) .json({ error: "An attendee with this email already exists" }); } // 构造邮件内容 const mailData = { from: process.env.USER_ID, to: req.body.email, subject: "Email Verification link", text: `Click on the link and verify your email`, html: `<a href="localhost:8000/api/verify">Click here to verify</a>`, }; try { // 等待邮件发送完成(Nodemailer v6+支持直接返回Promise) await transporter.sendMail(mailData); console.log("Email Sent Successfully"); res.status(200).json({message:"Verification link has been sent to your email. Please verify your email"}); } catch (error) { console.log(error); res.status(500).json({error: "Failed to send verification email"}); } };
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

