调用Mailchimp API持续返回HTTP 400状态码的原因排查
问题原因分析
- 核心逻辑位置错误:你当前调用Mailchimp接口的代码直接写在全局作用域,服务器启动时就会立即执行,此时
email、firstName、lastName三个变量还没有接收到表单提交的值,全是undefined,传递空的邮箱地址自然会触发400参数错误。你需要把接口调用逻辑挪到app.post("/")的路由回调内部,等拿到用户提交的表单数据后再发起请求。 - URL参数格式错误:你请求URL里的
<false>、<true>是文档里的占位符标识,实际请求不能带尖括号,直接写skip_merge_validation=false&skip_duplicate_check=true即可,这两个参数如果不需要特殊配置也可以直接省略。 - 缺失必填合并字段:如果你的Mailchimp列表设置了
FNAME、LNAME为必填合并字段,只传邮箱地址也会触发400错误,需要把姓名参数放到merge_fields中传递。
修正后的参考代码
const express = require("express"); const bodyParser = require("body-parser"); const request = require("request"); const app = express(); app.use(bodyParser.urlencoded({ extended: true })); app.use(express.static("public")); app.listen(3000,() =>{ console.log("Server is up and running on port 3000"); }) app.get("/signup", (req,res) =>{ res.sendFile(__dirname+"/signup.html"); }); app.post("/",(req,res) =>{ const firstName = req.body.firstName; const lastName = req.body.lastName; const email = req.body.userEmail; console.log(firstName,lastName,email); // 把Mailchimp请求逻辑移到路由内部,拿到数据后再执行 const data = { members: [ { email_address: email, status: "subscribed", merge_fields: { FNAME: firstName, LNAME: lastName } } ] }; const options = { // 去掉URL里的尖括号 url: "https://us6.api.mailchimp.com/3.0/lists/e1c06c3202?skip_merge_validation=false&skip_duplicate_check=true", headers: { "Authorization" : "ItsCrux 替换为你的实际API密钥" }, json: data, // 直接传json对象,request库会自动序列化 method: "POST" }; request(options, (error, response, body) => { if(error){ console.log(error); res.send("订阅失败,请稍后重试"); } else { console.log(response.statusCode); if(response.statusCode === 200){ res.send("订阅成功"); }else{ // 打印返回的错误信息方便排查 console.log(body); res.send("订阅失败,错误信息:" + body.detail); } } }); });
排查小技巧
如果修改后还是返回400,可以直接打印接口返回的body字段,Mailchimp的错误返回里会明确写明参数错误的具体原因,比如是邮箱格式不对、还是合并字段缺失、还是列表ID错误,比只看状态码好定位得多。
内容的提问来源于stack exchange,提问作者ItsCrux
相关产品推荐
相关产品推荐

