如何调试Node.js调用Mailchimp接口时的ECONNRESET与socket hangup错误
解决Mailchimp API调用的"socket hang up"错误
错误原因及修复步骤
你的代码存在几个明确问题,直接导致了连接重置错误:
1. 请求结束方法调用错误
你在https.request的回调里错误调用了req.end(),正确应该调用请求对象的end()方法(即https.request返回的对象),同时write和end操作不能放在回调内部,否则请求还未写入数据就会被服务器断开连接。
2. 未监听请求错误事件
当请求发生异常时,没有注册错误监听,导致Node.js抛出未处理的error事件,直接终止程序。
3. Express未向客户端返回响应
表单提交后,你的POST路由没有给用户返回任何响应,会导致客户端一直处于等待状态。
修复后的完整代码
const express = require("express"); const bodyParser = require("body-parser"); const https = require("https"); const app = express(); app.use(express.static("public")); app.use(bodyParser.urlencoded({ extended: true })); app.get("/", function (req, res) { res.sendFile(__dirname + "/signup.html"); }); app.post("/", function (req, res) { const firstName = req.body.fName; const lastName = req.body.lName; const email = req.body.email; const data = { members: [ { email_address: email, status: "subscribed", merge_fields: { FNAME: firstName, LNAME: lastName, }, }, ], }; const jsonData = JSON.stringify(data); const url = "https://us21.api.mailchimp.com/3.0/lists/bf6bb54d9b"; const options = { method: "POST", auth: "ram:395b652282fb64615919e5ffbc62e569-us21", }; // 重命名变量避免和已导入的request模块冲突 const mailchimpRequest = https.request(url, options, function (response) { // 根据响应状态返回对应页面 if (response.statusCode === 200) { res.sendFile(__dirname + "/success.html"); } else { res.sendFile(__dirname + "/failure.html"); } response.on("data", function (data) { console.log(JSON.parse(data)); }); }); // 监听请求错误,避免未处理异常 mailchimpRequest.on("error", function (err) { console.error("请求失败:", err); res.sendFile(__dirname + "/failure.html"); }); // 写入数据并结束请求 mailchimpRequest.write(jsonData); mailchimpRequest.end(); }); app.listen(3000, function () { console.log("Server is Running in Port 3000"); });
额外验证点
- 确认Mailchimp API密钥有效,且
us21前缀与你的账号服务器区域一致 - 核对列表ID
bf6bb54d9b无拼写错误 - 确保服务器可正常访问Mailchimp API地址,未被防火墙或代理拦截
内容的提问来源于stack exchange,提问作者Ram Baskar
相关产品推荐
相关产品推荐

