Ember.js JSON API 混淆

4

我目前正在尝试使用Ember 2.2.0和Ember Data 2.2.1创建一个简单的Ember应用程序。我创建了REST API遵循JSON API规范v1.0,这是通过GET /articles检索到的资源数组的示例。

{
  "links" : {
    "self" : "http://localhost:8080/test-app/rest/articles"
  },
  "data" : [
    {
      "id" : "5666157634499515eb7e13f0",
      "type" : "articles",
      "attributes" : {
        "title" : "test"
      }
    },
    {
      "id" : "5666157634499515eb7e13f1",
      "type" : "articles",
      "attributes" : {
        "title" : "test2"
      }
    },
    ...
  ]
}

我的文章路由看起来像这样:

// routes/articles.js
...
export default Ember.Route.extend({
  model() {
    return this.store.findAll('article');
  }
});

以及模型:

// models/article.js
...
export default DS.Model.extend({
  title: DS.attr(),
  text: DS.attr(),
  url: DS.attr(),
  date: DS.attr()
});

我完全按照教程 (https://guides.emberjs.com/v2.2.0/tutorial/ember-data/) 进行操作。但是当我打开视图时,出现了一个警告:

WARNING: Encountered "data" in payload, but no model was found for model name "datum" (resolved model name using test-app@serializer:-rest:.modelNameFromPayloadKey("data"))

没有数据被呈现。我可以看到请求的数据被正确地返回,但是它以某种方式被错误地解释了。

我的问题是:出了什么问题?我试图坚持使用默认API而不编写任何适配器或序列化程序,但它没有起作用。

--

更新:我将“链接”部分添加到响应对象中,现在我收到了两个警告:

WARNING: Encountered "links" in payload, but no model was found for model name "link" (resolved model name using test-app@serializer:-rest:.modelNameFromPayloadKey("links"))
WARNING: Encountered "data" in payload, but no model was found for model name "datum" (resolved model name using test-app@serializer:-rest:.modelNameFromPayloadKey("data"))

更新2:我通过重新构造API响应的方式使其工作,现在看起来像这样:
{
  "articles" : [ {
    "id" : "5666157634499515eb7e13f0",
    "attributes" : {
      "title" : "test"
    }
  }, {
    "id" : "5666141034499511aea5f43c",
    "attributes" : {
      "title" : "test"
    }
  },
  ...
}
  • 将“data”重命名为“articles”,这是特定于请求的资源和请求类型(获取单个,获取多个)
  • 从资源对象中删除“attributes”,现在所有属性都直接包含在其中
  • 从根对象中除了“articles”键之外删除所有键

我在这里看到了这个问题:ember data no model was found for attribute name 我不明白为什么这样可以工作,但是Ember教程中的示例却不行。该教程适用于Ember 2.2.0,这也是我使用的版本。我通过Ember CLI创建了我的项目,然后用Ember版本1.13替换了它。

--

更新3:已解决此问题。请参阅我的答案(我尚无法接受它)。基本上,我使用了错误的REST适配器。 ember-cli使用RESTAdapter生成默认适配器,必须将其更改为JSONAPIAdapter。

1个回答

5
问题在于Ember默认使用RESTAdapter。要使用JSON API格式的响应,必须使用JSONAPIAdapter。因此,在app/adapters/application.js中:
export default DS.JSONAPIAdapter.extend({
    ...
});

并且根据规范将每个API响应的内容类型更改为application/vpn.api+json


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接