【问题标题】:Ember.js - Error - "Assertion failed: You must include an `id` in a hash passed to `push`"Ember.js - 错误 - “断言失败:您必须在传递给 `push` 的哈希中包含 `id`”
【发布时间】:2014-01-18 00:15:51
【问题描述】:

通过使用 Express 编写的 REST API 将帖子(标题、文本)保存到 mongodb 数据库并刷新浏览器后,我收到此错误。我已经将我的主键设置为“_id”并且一直在阅读可能对数据进行规范化的信息?

这是来自服务器的有效负载(数据库中只有 1 个帖子):

{
  "posts": [
  {
    "title": "The Title",
    "text": "Lorem ipsum",
    "_id": "52c22892381e452d1d000010",
    "__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'
});

非常感谢任何帮助!如果您需要任何其他信息,请告诉我。 谢谢

【问题讨论】:

  • primaryKey是怎么设置的?
  • @kingpin2k 我用过DS.JSONSerializer.extend({ primaryKey: function(type) {return '_id';} });
  • 您介意在上面显示适配器和序列化程序代码吗?
  • @kingpin2k 当然,我将它们添加到底部。似乎我可以检索数据,但是对于从 api 返回的每个帖子,我都会收到错误消息。感谢您的帮助!

标签: ember.js


【解决方案1】:

使用自定义适配器/序列化器时,命名很重要。如果你想让它应用于整个应用程序,它应该被称为ApplicationSerializer

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

适配器:

App.ApplicationAdapter = DS.RESTAdapter.extend({
  namespace: 'api'
});

如果您只想将其应用于单个模型(这也适用于适配器)

App.PostSerializer = DS.RESTSerializer.extend({
  primaryKey: '_id'
});

【讨论】:

  • 感谢您的信息。我没有意识到这一点。我更新了序列化程序,但仍然出现错误。您是否认为问题是因为 mongo id 有 '_id' 而不仅仅是 'id' 而 Ember 找不到 id?
  • 我刚刚意识到主键是一个函数,它应该是一个普通属性(见上文),或者你应该在函数末尾添加.property()
  • 成功!非常感谢你的帮助!我添加了 .property() 并且它有效。
  • primaryKey 在我的应用程序中没有被调用,也许这与新版本的 ember-data 有关?
  • 请创建一个新问题并包含所有相关信息。
【解决方案2】:

我遇到了同样的错误,但经过一些调试后发现这是由于我的 rest API 没有返回保存的对象 json 引起的。

【讨论】:

    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2013-12-30
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多