【问题标题】:Ember.js error: You must include an 'id' for an object passed to 'push'Ember.js 错误:您必须为传递给“push”的对象包含一个“id”
【发布时间】:2017-10-19 12:24:45
【问题描述】:

我用来获取数据的 REST API 没有像 Ember.js 所期望的那样提供正确的 JSON。我们的数据中没有 id 值。

[{"objectID":"340907","owner":"Lokesh"},{"objectID":"340908","owner":"Cherukuri"}]

所以,我创建了一个序列化器:

serializers/baddata.js

import DS from 'ember-data';

export default DS.JSONSerializer.extend({
    primaryKey: 'objectID'
});

适配器/baddata.js

import DS from 'ember-data';

export default DS.RESTAdapter.extend({
    host: 'http://localhost:8080',
    buildURL : function(modelName, id) {
        return this.host + "/baddata/trains/"+ id;
    }
});

models/baddata.js

import DS from 'ember-data';

export default DS.Model.extend({
    owner: DS.attr('string')
});

这并没有解决问题。有人可以纠正我的错误吗?

【问题讨论】:

  • 一旦你使用primaryKey在你的序列化器中映射了ID,它现在被称为id,所以你不需要在你的模型中声明objectID,你应该参考代码中各处的相关字段为idpush 然后应该可以正常工作。它将在到达服务器的途中被映射回primaryKey
  • 没有。它没有用。同样的错误
  • 您使用的是哪个序列化程序(json, jsonapi, rest),这是您从 API 获得的完整响应吗?
  • 我正在使用 JSONSerializer。是的,这是完全响应

标签: javascript json ember.js ember-data


【解决方案1】:

我正在使用 mongo,在您的示例中,我看到您使用了 ApplicationSerializer。我认为你需要使用以下

如果你使用 JSONSerializer 那么

import DS from 'ember-data';
export default DS.JSONSerializer.extend({
  primaryKey: 'objectID'
});

如果你使用 REST 序列化器

import DS from 'ember-data';
export default DS. RESTSerializer.extend({
  primaryKey: 'objectID'
});

我尝试搜索 ApplicationSerializer 类,但在文档中未提及。这对我和 mongo 有用,我用来更改为 _id

希望对你有帮助

【讨论】:

  • 当我将它更改为 JSONSerializer 时,发生了同样的错误。但是当我更改为 RESTSerializer 时,出现新错误:无法读取 null 的属性“_internalModel”。该序列化程序是否希望我的响应具有根元素?
  • 您的服务器端端点如何发送数据?如果您使用 ActiveModelSerializer 或 RESTSerializer,则需要 root。这是相关的帖子,您可以在其中覆盖它以排除 root:stackoverflow.com/questions/17429426/…
  • 我改成了 JSONSerializer。但这并没有解决问题
【解决方案2】:

您需要使用 DS.RESTSerializer 并覆盖 normalizeResponse 将您的数据转换为:

{ baddata: { "id":"340907", "owner":"Lokesh" } }

objectID 转换为id 只会让您的生活更轻松。您也可以这样做,因为您已经需要覆盖 normalizeResponse 来格式化负载。

这假设您一次获取一条记录。如果你获取多条记录,你会想要

{
  baddatas: [
    { "id":"340907", "owner":"Lokesh" },
    { "id":"340908","owner":"Cherukuri" }
  ]
}

DS.RESTSerializer#normalizeResponse

【讨论】:

  • 如果是这种情况,那么在序列化程序上设置主键有什么意义,为什么文档没有反映这一点?
猜你喜欢
  • 2014-01-18
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2014-10-21
  • 2013-12-30
  • 2017-05-02
  • 2017-12-31
  • 2013-09-09
相关资源
最近更新 更多