我在查询 API 时收到“断言失败:您必须在传递给 `push` 的哈希中包含一个 `id`”

Posted

技术标签:

【中文标题】我在查询 API 时收到“断言失败:您必须在传递给 `push` 的哈希中包含一个 `id`”【英文标题】:I get "Assertion failed: You must include an `id` in a hash passed to `push` " when querying API 【发布时间】:2014-10-21 08:46:33 【问题描述】:

我一定已经阅读了关于我的问题的所有关于堆栈溢出的问题,但还没有找到解决方案。 我对 Ember 和 Node 很陌生,所以请多多包涵。

服务器以这种格式响应:


"_id" : "53fddf59d72f9b4d3a3e164a"
"about" : [
    "from" : "foo",
    "text" : "bar",
    ... ]

我的模型如下所示:

App.About = DS.Model.extend(
    from : DS.attr('string'),
    text : DS.attr('string'),
    ...

适配器和序列化器:

App.ApplicationAdapter = DS.RESTAdapter.extend(
    host: 'http://localhost:3000'
);

App.ApplicationSerializer = DS.JSONSerializer.extend(
    primaryKey: '_id'
);

还有我的路线:

App.AboutRoute = Ember.Route.extend(
    model: function() 
        return this.store.find('about');
    
);

使用车把:

<script type="text/x-handlebars" data-template-name="about">
    <p>from</p>
</script>

路由会渲染,但是控制台报错:

调试:------------------- ember.js:3285 调试:Ember:1.3.0 ember.js:3285 调试:Ember 数据:1.0.0-beta.5 ember.js:3285 调试:车把:1.3.0 ember.js:3285 调试:jQuery:1.10.2 ember.js:3285 调试:------------------- ember.js:3285 生成 -> route:application Object fullName: "route:application" ember.js:3285断言失败:您必须在传递给 push ember.js:3285 的哈希中包含 id 生成 -> 控制器:关于对象 fullName: "controller:about" ember.js:3285 转换为“关于”

我做错了什么?!


更新:

即使这不是我最终使用的确切格式,也接受了 Kingpin2k 的回答。有关详细信息,请参阅 cmets。

【问题讨论】:

只是猜测,但请尝试将 primaryKey 规范放入 AboutSerializer @torazaburo 不应该 ApplicationSerializer 将它应用到整个应用程序? 不知道,试试看。 【参考方案1】:

您的格式应该具有复数类型,以及各个记录上的 id。

 
  "abouts" : [
    
     "from" : "foo",
     "text" : "bar",
     "_id" : "53fddf59d72f9b4d3a3e164a"
    ,
    
     "from" : "foo2",
     "text" : "bar2",
     "_id" : "53fddf59d72f9b4d3a3e164k"
    ,
    ... ]
 

【讨论】:

好的,所以我更改了我的 api 以返回与上面完全相同格式的 json。但是我仍然收到错误Assertion failed: You must include an id in a hash passed to 'push'. 我在序列化程序中遗漏了什么吗?还是模型不对? Ember 是否要求根对象有想法? 我觉得你混用 JSONAdapter 和 RESTSerializer 很不爽,试试用 RESTAdapter 和 RESTSerializer,emberjs.jsbin.com/OxIDiVU/1011/edit,而且你有两次相同的主键。 当我使用 RESTSerializer 时,我收到“加载路由时出错:TypeError:无法读取未定义的属性 ID”。我也没有重复的 id,你认为你在看上面的答案吗? 我有同样的问题,但我似乎无法解决问题,因为我的 JSON 已经是上面推荐的格式 =/

以上是关于我在查询 API 时收到“断言失败:您必须在传递给 `push` 的哈希中包含一个 `id`”的主要内容,如果未能解决你的问题,请参考以下文章

Google Compute Engine:无法从 gcloud 终端查询 API

为啥我在使用 Google Maps API 时没有收到“同源政策”警告?

尝试发布到 API 时,我在 Flutter 中收到“状态”:400 错误

google.api_core.exceptions.ResourceExhausted: 429 查询 bigquery 时收到的消息大于最大值

您如何使用 gmail api 查询已发送的项目?

为啥我在运行查询时收到错误 -4700(尝试使用新功能模式)?