【问题标题】:findRecord giving error "Cannot read property '_internalModel' of undefined"findRecord 给出错误“无法读取未定义的属性 '_internalModel'”
【发布时间】:2015-10-01 14:20:44
【问题描述】:

在我们的 ember 应用中,我们使用以下版本的 ember-data 和 ember-data-factory-guy。

package.json

"ember-cli": "^1.13.8",
"ember-data": "1.13.9",
"ember-data-factory-guy": "1.13.10",

注意:我们使用的是 active-model 适配器,尚未迁移到 json-api 适配器。

import ActiveModelAdapter from 'active-model-adapter';
export default ActiveModelAdapter.extend({

路由:item.js

export default Ember.Route.extend(({
  model(params) {
    return this.store.findRecord('item', params.item_id);
  }
});

在开发模式下工作正常,但在运行测试用例时,遇到以下问题:

“显示单个项目”的测试用例失败并出现以下错误:

{
  "message": "Cannot read property '_internalModel' of undefined",
  "name": "TypeError"
}

ember-data/lib/system/stpre/finder.js,在 return 语句处失败

return promise.then(function (adapterPayload) { Ember.assert("您请求了一个" + typeClass.typeClassKey + " id " + id + ",但是适配器的响应没有任何数据", adapterPayload);

return store._adapterRun(function () {
  var requestType = get(serializer, 'isNewSerializerAPI') ? 'findRecord' : 'find';
  var payload = normalizeResponseHelper(serializer, store, typeClass, adapterPayload, id, requestType);
  //TODO Optimize
  var record = pushPayload(store, payload);
  return record._internalModel;
});

(https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/store/finders.js#L32)

我们在这里遗漏了什么吗?谁能帮我解决这个问题?我已经尝试将版本升级到最新版本,但仍然面临同样的问题。

【问题讨论】:

  • 您是否正在对响应进行存根处理? this.store.findRecord('item', params.item_id) 向服务器发出请求。
  • 是的,它正在向服务器发送请求,但我的 ember-data 存储中有可用的数据,所以希望从那里挑选它。因此没有取消该响应。
  • this.store.findRecord 将始终发送请求,即使您的商店中有该请求。如果您不想发送请求,请尝试peekRecord
  • 感谢@vikram7 的回复最后我能够解决它.. 我会将其添加为答案。回复:您的上述评论:参考此emberjs.com/blog/2015/06/18/…

标签: javascript ember.js ember-data ember-qunit


【解决方案1】:

在我的情况下,问题是服务器的响应没有根元素。

服务器正在为用户返回:

{
  surname: 'surname',
  name: 'name',
  _id: 56ead1ace85b04be4a7e50e6 
}

改为:

user: {
  surname: 'surname',
  name: 'name',
  _id: 56ead1ace85b04be4a7e50e6 
}

【讨论】:

    【解决方案2】:

    如果您使用findRecord() 查询服务器,Ember 期望响应格式为

    {singularModelName: {...}}
    

    如果您使用query() 查询服务器,Ember 期望响应格式为

    {pluralModelName: [...]}
    

    如果您在使用findRecord() 时没有遵循该响应模式,则会出现类型错误

    【讨论】:

      【解决方案3】:

      我在这里发布这个主要是为了提醒自己。我每隔几周就会遇到这个问题,然后来这里寻找答案:)

      我在运行验收测试时抛出了这个错误,因为我忘记告诉 ember-cli-mirage 生成假模型:

      beforeEach(function() {
        server.create('user', { id: window.sessionUser.id });
        server.create('project', { userId: window.sessionUser.id });
      });
      

      【讨论】:

        【解决方案4】:

        终于查明原因了:

        在我的适配器/application.js 中

        // Ember Data 2.0 Reload behavior
        shouldReloadRecord: function() { return true; },
        shouldReloadAll: function() { return true; },
        shouldBackgroundReloadRecord: function() { return true; },
        shouldBackgroundReloadAll: function() { return true; },
        

        这些行是我在修复弃用警告时添加的,因此,它会导致始终加载记录,尽管它们存在于 ember-data 存储中。所以现在我只是删除了那些。

        http://emberjs.com/blog/2015/06/18/ember-data-1-13-released.html#toc_new-adapter-hooks-for-better-caching这个参考帮助我更好地理解它:)

        【讨论】:

          猜你喜欢
          • 2018-12-22
          • 1970-01-01
          • 1970-01-01
          • 2020-10-15
          • 1970-01-01
          • 2019-02-28
          • 2017-09-28
          • 1970-01-01
          相关资源
          最近更新 更多