查找记录给出错误"Cannot read property '_internalModel' of undefined"



在我们的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",

注意:我们使用的是活动模型适配器,还没有迁移到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);
  }
});

在开发模式下工作良好,但在运行测试用例时,我面临以下问题:

"display single item"的测试用例失败,出现以下错误:

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

ember-data/lib/system/stpre/finder.js, failed at return statement

回报的承诺。然后(function (adapterPayload) {安博。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)

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

  • 在ember-data-factory-guy的问题中发布https://github.com/danielspaniel/ember-data-factory-guy/issues/136

在我的例子中,问题是服务器的响应没有根元素。

服务器正在返回一个用户:

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

:

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

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

{singularModelName: {...}}

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

{pluralModelName: [...]}

如果您在使用findRecord()

时没有遵循响应模式,则会发生类型错误。

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

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

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

终于找到确切原因了:

在我的adapter/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这个参考帮助我更好地理解它:)

相关内容

  • 没有找到相关文章

最新更新