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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:35:49