报错表明响应内容非JSON格式,常见于返回HTML(如404页、登录页)或空响应;应先检查status_code、打印response.text确认内容,再按Content-Type选择解析方式。

response.json() 会报 SyntaxError: Unexpected token N in JSON at position 0 怎么办
这不是 JSON 文件写错了,而是 response.json() 在尝试解析一个根本不是 JSON 的响应体。最常见的情况是:请求返回了 HTML(比如 404 页面、Nginx 默认错误页、或后端重定向到登录页),而你却直接调用了 .json() —— 浏览器看到第一个字符是 或 <code>N(如 “Not Found”),就立刻抛错。
实操建议:
- 打开浏览器开发者工具的 Network 面板,点开对应请求,切换到 Response 标签页,**直接看返回内容是什么**;如果是 HTML 或空字符串,就别再怪
json()了 - 在调用
.json()前加一层状态检查:if (!response.ok) throw new Error(`HTTP ${response.status}`) - 确保后端实际返回的是 JSON,且
Content-Type响应头为application/json;如果后端用res.send('{...}')而没设 header,response.json()就会失败
fetch() 后必须调用 response.json() 才能拿到 JS 对象吗
是的,但得理解清楚:不调用它,你就拿不到解析后的对象;调用错了时机或方式,反而会出错。
关键点:
立即学习“前端免费学习笔记(深入)”;
-
response.json()返回一个 Promise,必须用.then()或await等待它完成,不能直接对response对象做JSON.parse() - 同一个
response只能调用一次.json()(或.text()、.blob()),因为响应体流只能被读取一次;重复调用会报TypeError: Already read - 如果你需要同时获取 JSON 和其他信息(比如响应头),必须在
.json()之前读取,例如:const contentType = response.headers.get('content-type')
本地 HTML 直接双击打开时 fetch('./data.json') 失败
这是 file:// 协议的安全限制导致的,和 response.json() 本身无关,但它是新手最常卡住的第一步。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
现象:控制台报 net::ERR_FAILED 或 CORS error,甚至根本没发请求。
原因:浏览器禁止从 file:// 页面发起跨源(包括本地文件)的 fetch 请求。
解决方法只有一条路:
- 用 HTTP 服务启动页面:VS Code 安装 Live Server 插件后右键 → “Open with Live Server”,或终端运行
npx http-server(需先npm install -g http-server),然后访问http://127.0.0.1:8080 - 确认
data.json和 HTML 文件在同一目录下,且 JSON 文件语法合法(无尾逗号、字符串用双引号)
解析后往页面写数据,为什么不能直接 innerHTML += JSON.stringify(data)
因为这既危险又多余:XSS 漏洞风险高,且把对象转成字符串再塞进 HTML,完全没利用好 DOM 的结构能力。
更安全、更可控的做法是:
- 用
textContent替代innerHTML赋值纯文本内容,例如:document.getElementById('title').textContent = data.title - 渲染列表时用
document.createElement()+appendChild(),避免拼接字符串 - 如果真要展示原始 JSON 结构(比如调试),用
pre+textContent:document.querySelector('pre').textContent = JSON.stringify(data, null, 2)
容易忽略的一点:response.json() 解析失败时不会静默吞掉错误,但如果你没写 .catch() 或 try/catch,错误会变成 unhandled rejection,控制台可能只显示红字不报行号——务必配好错误处理分支。


















