Ember数据:您的服务器返回了一个带有键0的哈希,但您没有映射

时间:2013-08-02 18:43:24

标签: ember.js ember-data

我有一个简单的模型,并使用RESTadapter来获取数据。执行JSON请求,但后来我收到以下错误:“您的服务器返回了一个带有键0的哈希,但您没有映射它”

知道原因是什么吗?

型号:

App.Article = DS.Model.extend({
    title: DS.attr('string')
});

请求文章的JSON响应.json:

[
  {
    "id": 1,
    "title": "Title 1"
  },
  {
    "id": 2,
    "title": "Title 2"
  }
]

我认为原因是回复的格式......我已经改变了我的回复以包含“文章”,但是仍然存在同样的问题。

[
  {
    "article": {
      "id": 1,
      "title": "Title 1"
    }
  },
  {
    "article": {
      "id": 2,
      "title": "Title 2"
    }
  }
]

我在哪里可以找到关于如何格式化JSOn请求和响应以用于RESTadapter的良好文档?

3 个答案:

答案 0 :(得分:4)

您正在寻找的JSON应该有一个根元素

{"articles": [ 
  { 
    "id": 1,
    "title": "Title 1"
  },
  {
    "id": 2,
    "title": "Title 2"
   }
  ]
}

您可以在Ember Docs RESTAdapterJSONapi project

中找到文档

答案 1 :(得分:2)

@kiwiupover 98%是正确的,当有多个记录时,它应该复数为articles

{"articles": [
     { 
       "id": 1,
       "title": "Title 1"
     },
     {
       "id": 2,
       "title": "Title 2"
     }
]}

答案 2 :(得分:1)

如果您无法访问服务器,则很容易修改适配器。对于“GET”请求,您需要覆盖适配器中的findfindAll

App.Store = DS.Store.extend({
  adapter: DS.RESTAdapter.create({
    find: function(store, type, id) {
      var root = this.rootForType(type), adapter = this;

      return this.ajax(this.buildURL(root, id), "GET").
      then(function(json){
        var updatedJSON = {};
        updatedJSON[root] = json;
        adapter.didFindRecord(store, type, {article: json}, id);
      }).then(null, DS.rejectionHandler);
    },

    findAll: function(store, type, since) {
      var root, adapter;

      root = this.rootForType(type);
      adapter = this;

      var resourceName = this.pluralize(root);

      return this.ajax(this.buildURL(root), "GET",{
        data: this.sinceQuery(since)
      }).then(function(json) {
        var updatedJSON = {};
        updatedJSON[resourceName] = json;
        adapter.didFindAll(store, type, updatedJSON);
      }).then(null, DS.rejectionHandler);
    }
  })
});

目前,这些功能存在于源代码here in rest_adapter.js中。

这里的区别在于每个函数中定义updatedJSON的位置。它从服务器获取json并构造一个新对象(希望)你需要的正确密钥。