【问题标题】:Getting Django API data with Ember使用 Ember 获取 Django API 数据
【发布时间】:2015-06-28 03:04:37
【问题描述】:

我正在为我的 REST 服务器启动一个使用 ember.js 和 Django Rest Framework 的项目。

我在 ember 端使用 adapter 将数据转换为 Ember 需要的正确格式。我正在向服务器发出请求,并获得 200 并返回数据,但是 Ember 抛出错误 Error while processing route: index Assertion Failed: The response from a findAll must be an Array, not undefined

关于这个错误的帖子很多,但我找不到任何与我的问题相关的帖子,这似乎是一种可能由很多事情引起的全面错误?

我不知所措,因为我的服务器正在接收请求并以我期望从服务器获得的格式返回数据。我不确定如何判断错误是在我的 Ember 应用中,还是适配器没有正确转换我的数据。

// routers/index.js
export default Ember.Route.extend({
  model: function() {
    return this.store.find('user');
  }
});

// config/environment.js
APP: {
  API_NAMESPACE: 'v1',
  ENV.APP.API_HOST = 'http://localhost:8000',
},

只有在我的路由器中有这个代码是我得到错误的原因。我觉得这是一个非常简单的问题,但似乎无法解决。我已经尝试将该代码移动到不同的部分,例如控制器,只是为了看看我可以获取数据。希望有人给点建议,谢谢。让我知道我可以发布的任何其他帮助。

编辑:查看源代码,序列化程序出现问题:

extractArray: function(store, type, payload) {
    // Convert payload to json format expected by the RESTSerializer.
    // This function is being overridden instead of normalizePayload()
    // because `results` will only be in lists.
    console.log(type);
    var convertedPayload = {};
    if (payload.results) {
      convertedPayload[type.modelName] = payload.results;
    } else {
      convertedPayload[type.modelName] = payload;
    }
    return this._super(store, type, convertedPayload);
  },

type.modelName 未定义。当我查看类型对象时,它只是一个空白的 Class()。当我登录type.toString() 我得到joe2go@model:user:

可能与我的模型有关吗?对我来说,一切似乎都很标准。

import DS from 'ember-data';

export default DS.Model.extend({
  username: DS.attr('string'),
  firstName: DS.attr('string'),
  lastName: DS.attr('string')
});

【问题讨论】:

  • 错误是响应中的数据格式不正确,所以适配器和 ember-data 期望有数据的地方什么都没有。
  • 如果您发布您正在使用的 ember-data 版本,以及您的 API 响应针对该端点的样子,我可以为您指明正确的方向。
  • 我不确定您使用的适配器是否维护得很好,您可能需要自己动手(我过去曾为 django 做过几次)。如果您需要更广泛的帮助,请在 ember 社区 slack 上的 #needhelp 中联系我。
  • @runspired 谢谢!我使用的是 0.5.6,来自服务器的响应是来自 DRF [{'key':'value', 'key':'value'}] 的默认响应。我有另一个项目,它在 Django 端有适配器并且适用于该项目,但希望在这个项目的 ember 端有适配器。
  • 后端响应什么负载?

标签: ember.js ember-data


【解决方案1】:

包中显然存在错误。

extractArray: function(store, type, payload) {
 // Convert payload to json format expected by the RESTSerializer.
    // This function is being overridden instead of normalizePayload()
    // because `results` will only be in lists.

    var convertedPayload = {};
    if (payload.results) {
      convertedPayload[type.modelName] = payload.results;
    } else {
      convertedPayload[type.modelName] = payload;
    }
    return this._super(store, type, convertedPayload);
  },

在序列化器内部它引用type.modelName,但应该是type.typeKey

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多