使用JavaScript读取本地JSON文件遇异常:请求被取消、status为0
排查Chrome中本地XHR读取JSON文件返回status 0且请求canceled的问题
咱们一步步来拆解这个问题,本地文件的XHR请求在Chrome里经常会碰到这类权限或会话相关的坑,我给你梳理几个关键排查点:
1. 先确认Chrome启动参数是否真的生效
这是最容易被忽略的点!很多人启动带参数的Chrome时,没彻底关闭所有已打开的Chrome窗口/进程,导致新启动的窗口直接继承了原来的会话,加的特殊参数根本没起作用。
- 操作步骤:先打开任务管理器,把所有
chrome.exe进程全部结束干净,然后再运行你的启动命令。 - 参数优化:你命令里的路径分隔符可以调整得更规范(Windows下用反斜杠更稳妥),另外建议加上
--disable-site-isolation-trials参数(新版本Chrome的站点隔离机制可能会拦截本地文件请求),修改后的命令如下:
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir="C:\Chrome dev session" --disable-web-security --allow-file-access-from-files --disable-site-isolation-trials
2. 验证本地文件路径的正确性
先排除最基础的路径问题:
- 直接把
file:///C:/tmp/abc.json复制到Chrome地址栏,看能不能正常打开JSON文件。如果打不开,说明文件不存在、路径写错,或者文件本身有JSON语法错误(格式不对会导致Chrome无法渲染)。 - 检查路径里有没有特殊字符(比如空格、中文),如果有的话,建议把文件移到不带特殊字符的路径下(比如
C:\tmp\abc.json就没问题,但如果是C:\我的文件\abc.json可能会触发权限拦截)。
3. 简化XHR代码,排查回调问题
你的代码里用到了callback函数,但如果这个函数没有提前定义,可能会导致代码报错,间接引发请求被canceled。先把代码改成最简化的版本,直接打印日志看状态:
var xobj = new XMLHttpRequest(); xobj.overrideMimeType("application/json"); xobj.open('GET', 'file:///C:/tmp/abc.json', true); xobj.onreadystatechange = function() { console.log('当前readyState:', xobj.readyState, 'status:', xobj.status); if (xobj.readyState === 4) { console.log('响应内容:', xobj.responseText); } }; xobj.send(null);
打开Chrome控制台(F12),看日志输出,确认请求走到了哪一步,有没有未捕获的报错信息。
4. 替代方案:用本地HTTP服务器彻底规避权限问题
如果上面的方法都没解决,其实最稳妥的方式是用HTTP协议访问本地文件,而非直接读取本地文件系统。比如用Node.js的http-server:
- 先安装:打开命令提示符,运行
npm install -g http-server(需要先安装Node.js) - 进入
C:\tmp目录,运行http-server - 然后把你的XHR请求地址改成
http://localhost:8080/abc.json,正常启动Chrome(不需要加任何特殊参数),这样就完全不会有本地文件的权限限制了。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

