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

Node.js调用Mailchimp API时JSON解析语法错误求助

解决Mailchimp API调用时的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:36:44