【问题标题】:Angular resource 404 Not Found找不到角度资源404
【发布时间】:2018-08-16 05:48:58
【问题描述】:

我读过其他类似404错误的帖子,我的问题是我可以正确查询JSON数据,但无法保存而不出现此错误。

我正在使用 Angular 的 $resource 与 JSON 端点进行交互。我从工厂返回的资源对象如下:

app.factory('Product', function($resource) {
        return $resource('api/products.json', { id: '@id' });
});

我的 JSON 是有效的,我可以成功地使用资源的 query() 方法返回我的指令中的对象,如下所示:

var item = Product.query().$promise.then(function(promise) {
  console.log(promise) // successfully returns JSON objects
});

但是,当我尝试使用 save() 方法保存已更新的项目时,我收到 404 Not Found 错误。

这是我得到的错误:

http://localhost:3000/api/products.json/12-34 404 (Not Found)

我知道我的文件路径是正确的,因为我可以返回项目来更新视图。为什么会出现此错误?如何保存项目?

这是我的数据结构:

[
    {
        "id": "12-34",
        "name": "Greece",
        "path": "/images/athens.png",
        "description": ""
    },
    ...
]

【问题讨论】:

  • 您确定POST 请求应该命中products.json/12-34
  • 您收到此错误是因为服务器找不到此文件http://localhost:3000/api/products.json/12-34 并且没有此路径
  • 如果我执行Product.save({ id: myObject.id }) 之类的操作,并且myObject.id 等于12-34,并且如果我的数据结构如上,不应该吗?
  • @Grundy 如果我做Product.save({ id: myObject.id }),它不会返回具有匹配ID 的JSON 文件的inside 对象吗?还是它正在寻找一个名为12-34 的文件?
  • 不,你有一个简单的json文件,不能处理任何查询,你应该为进程postput和其他查询添加一些服务器代码

标签: json angularjs angular-resource


【解决方案1】:

默认情况下$save 方法使用 POST 动词,您需要确定服务器接受哪些 HTTP 动词 以便进行更新,大多数现代 api 服务器接受 PATCHPUT 更新数据的请求,而不是 POST

然后配置您的 $resource 实例以使用正确的动词,如下所示:

app.factory('Product', function($resource) {
        return $resource('api/products.json', { id: '@id' }, {'update': { method:'PUT' }});
});

查看$resource docs 了解更多信息。


注意: $resource 旨在将前端与支持 RESTful 协议的后端服务器连接起来,除非您使用一个来接收数据并将其保存到文件而不是数据库中。 否则,如果您只使用需要实现$resource 并且暂时没有服务器的前端解决方案,那么请使用假的,那里有很多很棒的解决方案,例如deployd

【讨论】:

    【解决方案2】:

    您可能没有为 /api/products.json/12-34 之类的 url 实现 POST 方法。从 Angular 请求 POST 方法以保存新资源。因此,您需要更新您的服务器端应用程序以支持它并进行实际保存。

    【讨论】:

    • 难道angular的资源不能从前端更新JSON文件,那是怎么做的呢?
    • @Himmel,angular是客户端,不能直接更新服务器上的文件
    • Angular 将向服务器应用程序发送请求以保存资源。如果服务器应用程序不知道怎么做,angular 会收到错误。
    • 好的,那么添加一个带有 POST 的节点后端,PUT 方法可以更新 JSON 文件吗?
    • 是的,但除非您有相应的框架,否则您还需要进行实际保存。
    【解决方案3】:
    app.factory('Product', function($resource) {
        return $resource('api/products.json/:id', { id: '@id' });
    });
    

    尝试在 URL 字符串的末尾添加“/:id”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多