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

Node.js调用Mailchimp API实现邮件订阅报ECONNRESET错误

问题原因

你遇到的socket hang up(ECONNRESET)错误核心是https模块的请求调用逻辑写反了,同时附带几个参数格式问题,具体如下:

  • 最致命的逻辑错误:https.request()方法本身会返回请求实例对象,你需要在这个实例上调用write()发送请求体、end()标记请求发送完成,同时监听它的error事件捕获网络异常。但你的代码错误地把响应回调里response.on("data")的返回值当成了请求对象,在这个完全不相关的返回值上调用write/end,相当于从来没有把订阅的JSON数据发送给Mailchimp服务器,服务器长时间等不到请求内容直接断开TCP连接,触发连接重置错误。
  • 没有监听请求对象的error事件:网络请求出错时没有异常捕获逻辑,错误直接冒泡到Node.js主进程导致服务崩溃,触发nodemon重启。
  • Mailchimp接口参数格式错误:批量添加成员接口要求merge_fields字段传对象,你错误地套了一层数组,就算请求发送成功也会返回400参数错误。
  • 代码里的{list_id}、{API_id}是占位符,如果没有替换成你自己的Mailchimp受众ID、API密钥,就算请求逻辑正确也会鉴权失败。
  • 额外缺失必要请求头:没有指定Content-Type: application/json,部分情况下Mailchimp服务器会直接拒绝未声明格式的请求。
修复方案

按以下步骤调整代码即可:

  1. 修正https.request的调用结构,拿到正确的请求实例后再发送数据、监听错误
  2. 去掉merge_fields外层的多余数组,直接传姓名字段对象
  3. 补全JSON格式对应的请求头
  4. 替换所有占位符为你自己的Mailchimp配置值
  5. 补充响应处理逻辑,根据接口返回结果给前端返回对应提示

修复后的完整app.js代码如下:

const express = require("express");
const bodyParser = require("body-parser");
const app = express();
const https = require("https");
// 删掉未使用的request包引入,该包已废弃,原生https足够实现需求

app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static("public"));

app.get("/", function (req, res) {
  res.sendFile(__dirname + "/signup.html");
});

app.post("/", function (req, res) {
  const fname = req.body.firstName;
  const sname = req.body.lastName;
  const e_mail = req.body.Email;
  // 修正merge_fields格式,去掉外层数组
  const data = {
    members: [
      {
        email_address: e_mail,
        status: "subscribed",
        merge_fields: {
          FNAME: fname,
          LNAME: sname
        }
      }
    ]
  };

  const jsonData = JSON.stringify(data);
  // 替换{list_id}为你自己的Mailchimp Audience ID,注意账号对应的服务器前缀us10要和你的账号一致
  const url = "https://us10.api.mailchimp.com/3.0/lists/替换成你的真实list_id";
  const options = {
    method: "POST",
    // 替换{API_id}为你的真实Mailchimp API密钥,前面的hamza可以随便填,Mailchimp不校验用户名
    auth: "hamza:替换成你的真实API密钥",
    headers: {
      "Content-Type": "application/json",
      "Content-Length": Buffer.byteLength(jsonData)
    }
  };

  // 拿到正确的请求实例
  const mailchimpReq = https.request(url, options, function (response) {
    let responseData = "";
    // 拼接分片响应数据
    response.on("data", function (chunk) {
      responseData += chunk;
    });
    // 响应接收完成后处理结果
    response.on("end", function () {
      const parsedRes = JSON.parse(responseData);
      console.log(parsedRes);
      // 根据状态码返回对应提示
      if (response.statusCode === 200) {
        res.send("订阅成功!");
      } else {
        res.send("订阅失败,错误信息:" + parsedRes.detail);
      }
    });
  });

  // 监听请求错误,避免进程直接崩溃
  mailchimpReq.on("error", function (err) {
    console.error("请求Mailchimp失败:", err);
    res.send("服务器异常,请稍后重试");
  });

  // 在正确的请求实例上发送数据、结束请求
  mailchimpReq.write(jsonData);
  mailchimpReq.end();
});

app.listen(3000, function () {
  console.log("服务运行在3000端口");
});

注意:如果你的Mailchimp账号不是分配在us10服务器(API密钥最后一段就是服务器前缀,比如密钥最后是-us10才对应us10域名),要把url里的us10.api.mailchimp.com改成对应前缀的域名,不然也会请求失败。

内容的提问来源于stack exchange,提问作者Hamza Laabidi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:09:18