Node.js调用Mailchimp API非200状态无法跳转失败页如何解决
问题根因
你代码里有两个直接导致故障的逻辑错误:
- 状态码判断对象搞错了:你写的
res.statusCode是当前Express服务返回给浏览器的响应对象状态,默认值就是200,根本不是Mailchimp接口的返回状态。Mailchimp接口的返回结果存在你声明的response变量里,判断逻辑完全没用到这个变量。 - 缺少异步异常捕获:Mailchimp官方SDK在接口返回非200状态(比如邮箱已订阅、参数格式错误、ListID填错、密钥无效)时,会直接抛出异步异常。你用
await调用接口时没有加try/catch包裹,异常触发后你的Node服务会直接崩溃,浏览器自然会提示localhost拒绝连接,根本走不到你写的else分支。
之所以成功场景能正常跳转,是因为接口调用成功时SDK不会抛错,代码能正常执行到判断逻辑,而res.statusCode默认就是200,刚好匹配上成功分支,属于歪打正着。
修复方案
用try/catch包裹第三方接口调用逻辑,成功时返回成功页,捕获到异常时返回失败页即可,修复后的代码如下:
app.post("/", async(req, res, next)=>{ const {fName, lName, email} = req.body.user; try { // 等待Mailchimp接口响应,调用成功不抛错就走成功逻辑 await mailchimp.lists.addListMember("List_ID", { email_address: email, status: "subscribed", merge_fields:{ FNAME: fName, LNAME: lName, }, }); res.sendFile(__dirname + "/success.html"); } catch (err) { // 所有接口调用失败、返回非200状态的场景都会走到这里 // 需要排查具体错误的话可以打印err查看详情 res.sendFile(__dirname + "/failure.html"); } });
补充说明
如果需要区分不同的失败场景做定制化提示,可以在catch块中读取err.status拿到Mailchimp返回的HTTP状态码,读取err.response.text或者err.response.body拿到接口返回的具体错误信息,再做对应逻辑处理。
内容的提问来源于stack exchange,提问作者Anant Sharma
相关产品推荐
相关产品推荐

