Node.js调用Mailchimp API时JSON解析语法错误求助
SyntaxError: Unexpected token < in JSON at position 0错误 这个错误的核心原因很明确:你尝试把HTML错误页面解析成JSON了。这说明Mailchimp API没有返回你预期的JSON响应,而是返回了一个错误页面,大概率是你的请求本身存在问题导致的。下面一步步帮你排查修复:
1. 修复未正确结束的请求
你代码里的request.end;是个低级错误——这只是引用了函数,没有实际调用它。请求根本没发送完成,服务器自然会返回错误页面。
修复:
把request.end;改成request.end();
2. 必须添加Content-Type请求头
发送JSON格式的数据时,必须告诉Mailchimp你发送的是JSON,否则它无法正确解析你的请求,直接返回错误页面。
修复:
在options对象里添加headers属性:
const options = { method: "POST", auth: "Jewel:a940bdffbeedd3146d8722711e7c4e98-us7", headers: { "Content-Type": "application/json" // 新增这行 } }
3. 正确处理分块的响应数据
response.on("data")事件会多次触发(当响应数据较大时,服务器会分块返回),你直接在这个事件里解析JSON,很可能拿到的是不完整的字符串,导致解析失败。
修复:
先收集所有响应数据,在end事件里再统一解析:
const request = https.request(url, options, (response) => { let responseData = ""; // 收集分块数据 response.on("data", (chunk) => { responseData += chunk; }); // 所有数据接收完成后再解析 response.on("end", () => { try { const result = JSON.parse(responseData); console.log(result); // 这里可以根据返回结果给用户返回成功/失败页面 if (result.errors.length === 0) { res.sendFile(__dirname + "/success.html"); } else { res.sendFile(__dirname + "/failure.html"); } } catch (err) { console.error("解析响应失败:", err); res.send("请求出错了,请稍后重试"); } }); });
4. 额外修复:静态文件路径问题
你的HTML里引用CSS的路径错了:./public/style.css。因为你用了app.use(express.static("public")),public文件夹已经是静态资源的根目录了,直接用/style.css就能访问到文件。
修复:
把<link rel="stylesheet" href="./public/style.css">改成<link rel="stylesheet" href="/style.css">
修复后的完整Node.js代码
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("/", (req, res) => { res.sendFile(__dirname + "/app.html"); }); app.post("/", (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://us7.api.mailchimp.com/3.0/lists/0457e81530"; const options = { method: "POST", auth: "Jewel:a940bdffbeedd3146d8722711e7c4e98-us7", headers: { "Content-Type": "application/json" } }; const request = https.request(url, options, (response) => { let responseData = ""; response.on("data", (chunk) => { responseData += chunk; }); response.on("end", () => { try { const result = JSON.parse(responseData); console.log(result); if (result.errors.length === 0) { res.sendFile(__dirname + "/success.html"); } else { res.sendFile(__dirname + "/failure.html"); } } catch (err) { console.error("解析响应失败:", err); res.send("请求出错了,请稍后重试"); } }); }); request.write(jsonData); request.end(); // 这里已经修复 }); app.listen(process.env.PORT || 3000, function () { console.log("server is running on port 3000"); });
最后再确认一下你的Mailchimp List ID和API Key是否完全正确,确保API Key的后缀-us7和URL中的区域us7一致。
内容的提问来源于stack exchange,提问作者Oriyomi

