Ember.js-错误-“;断言失败:必须在传递给“push”的哈希中包含“id”;

Ember.js-错误-“;断言失败:必须在传递给“push”的哈希中包含“id”;,ember.js,Ember.js,在通过使用Express编写的REST API将帖子(标题、文本)保存到mongodb数据库并刷新浏览器后,我出现了此错误。我已经将我的主键设置为“\u id”,并且一直在阅读关于可能规范化数据的内容 以下是来自服务器的有效负载(以db为单位仅1个post): { “员额”:[ { “头衔”:“头衔”, “文本”:“Lorem ipsum”, “_id”:“52C22892381E452D1D0000010”, “_v”:0 } ] } 控制员: App.PostsController = E

在通过使用Express编写的REST API将帖子(标题、文本)保存到mongodb数据库并刷新浏览器后,我出现了此错误。我已经将我的主键设置为“\u id”,并且一直在阅读关于可能规范化数据的内容

以下是来自服务器的有效负载(以db为单位仅1个post):

{
“员额”:[
{
“头衔”:“头衔”,
“文本”:“Lorem ipsum”,
“_id”:“52C22892381E452D1D0000010”,
“_v”:0
}
]
}
控制员:

App.PostsController = Ember.ArrayController.extend({
    actions: {
      createPost: function() {
        // Dummy content for now
        var to_post = this.store.createRecord('post', {
          title: 'The Title',
          text: 'Lorem ipsum'
        });
        to_post.save();
      }
    } 
 });
模型:

App.Post = DS.Model.extend({
   title: DS.attr('string'),
   text: DS.attr('string')
});
序列化程序:

App.MySerializer = DS.RESTSerializer.extend({
  primaryKey: function(type){
    return '_id';
  }
});
适配器:

App.ApplicationAdapter = DS.RESTAdapter.extend({
  namespace: 'api'
});
App.ApplicationAdapter = DS.RESTAdapter.extend({
  namespace: 'api'
});
非常感谢您的帮助!如果您需要任何其他信息,请告诉我。
感谢使用自定义适配器/序列化程序时,命名非常重要。如果要将其应用于整个应用程序,应将其称为
ApplicationSerializer

App.ApplicationSerializer = DS.RESTSerializer.extend({
  primaryKey: '_id'
});
适配器:

App.ApplicationAdapter = DS.RESTAdapter.extend({
  namespace: 'api'
});
App.ApplicationAdapter = DS.RESTAdapter.extend({
  namespace: 'api'
});
如果您只想将其应用于单个模型(这也适用于适配器)


我也有同样的错误,但在一些调试后发现这是由于我的RESTAPI没有返回保存的json对象造成的

您是如何设置primaryKey的?@kingpin2k我使用了
DS.JSONSerializer.extend({primaryKey:function(type){return'_id';}})你介意显示上面的适配器和序列化程序代码吗?@kingpin2k当然,我把它们添加到了底部。看起来我可以检索数据,但是对于从api返回的每个post,我都会得到一个错误。谢谢你的帮助!谢谢你的信息。我没有意识到这一点。我更新了序列化程序,但仍然收到错误。你认为问题是因为mongo id有“\u id”而不是“id”,并且Ember找不到id吗?我刚刚意识到主键是一个函数,它应该是一个普通属性(见上文),或者你应该在函数success的末尾加上
.property()
!非常感谢你的帮助!我添加了.property(),它可以工作。我的应用程序中没有调用primaryKey,也许这与新版本的余烬数据有关?请创建一个新问题并包含所有相关信息。