AngularJS v1.4中ngResource save出现404错误的解决咨询
看起来你遇到的问题核心是静态JSON文件无法处理POST/PUT请求,再加上$resource的默认行为导致请求URL指向了不存在的文件。让我一步步帮你分析和解决:
问题根源
你在eventData的save方法里手动给event设置了id:999,而AngularJS的$resource默认逻辑是:如果对象包含id属性,它会把这个id填充到URL模板data/event/:id.json里,最终发送请求到data/event/999.json——但这个文件显然不存在,所以返回404。
另外,静态JSON文件本身只能响应GET请求,无法处理POST或PUT(这是静态文件服务器的限制),所以即使URL正确,你也无法真正"保存"数据到本地JSON文件里。
解决方案(针对教程模拟场景)
因为你是跟着旧教程学习,不需要真正的后端接口,我们可以用两种方式解决:
1. 模拟保存成功,跳过实际HTTP请求
修改你的EventData.js,直接返回一个已resolved的Promise来模拟保存成功,这样既符合教程的逻辑,又不会触发404错误:
eventsApp.factory('eventData', function ($resource, $q) { var resource = $resource('data/event/:id.json', { id: '@id' }, { "getAll": { method: "GET", isArray: true, params: { something: "foo" } } }); return { getEvent: function () { return resource.get({ id: 1 }); }, save: function (event) { // 模拟保存成功,直接返回resolved promise return { $promise: $q.resolve({ message: 'Event saved successfully!' }) }; } } });
2. 自定义$resource的save动作,强制请求到固定路径
如果你想保留实际的HTTP请求(用于验证URL是否正确),可以给$resource添加自定义的save配置,跳过id占位符:
eventsApp.factory('eventData', function ($resource) { var resource = $resource('data/event/:id.json', { id: '@id' }, { "getAll": { method: "GET", isArray: true, params: { something: "foo" } }, // 自定义save动作,指向不带id的基础路径 "save": { method: "POST", url: "data/event.json" } }); return { getEvent: function () { return resource.get({ id: 1 }); }, save: function (event) { // 不需要设置event.id,让请求发送到data/event.json return resource.save(event); } } });
注意:静态服务器对POST请求到data/event.json仍会返回404,但这是正常的——因为静态文件无法处理写入操作,后续如果接入真实后端,只需要把URL改成后端API地址即可。
额外说明
旧教程里的代码可能假设存在后端API来处理save请求,而不是静态JSON文件,所以你需要根据自己的学习环境调整。如果需要本地模拟可写入的后端,可以使用json-server工具(但这属于额外工具,旧教程可能没涉及)。
内容的提问来源于stack exchange,提问作者Tonks

