在我们的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);
}
});
在开发模式下正常工作,但在运行测试用例时,我面临以下问题:
测试用例"显示单项"失败并出现以下错误:
{
"message": "Cannot read property '_internalModel' of undefined",
"name": "TypeError"
}
ember-data / lib / system / stpre / finder.js,return
语句失败
return promise.then(function(adapterPayload){ Ember.assert("你请求#34; + 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)
我们在这里遗漏了什么吗?有人可以帮我解决这个问题吗?我尝试将版本升级到最新版本,但仍面临同样的问题。
答案 0 :(得分:2)
在我的情况下,问题是服务器的响应没有根元素。
服务器正在为用户返回:
{
surname: 'surname',
name: 'name',
_id: 56ead1ace85b04be4a7e50e6
}
代替:
user: {
surname: 'surname',
name: 'name',
_id: 56ead1ace85b04be4a7e50e6
}
答案 1 :(得分:2)
如果您使用findRecord()
查询服务器,Ember希望响应的格式为
{singularModelName: {...}}
如果您使用query()
查询服务器,Ember希望响应的格式为
{pluralModelName: [...]}
如果您在使用findRecord()
答案 2 :(得分:1)
我主要在这里发帖,以提醒自己。我每隔几周就遇到这个问题并来这里寻找答案:)
我在运行验收测试时抛出了这个错误,因为我忘了告诉ember-cli-mirage生成假模型:
beforeEach(function() {
server.create('user', { id: window.sessionUser.id });
server.create('project', { userId: window.sessionUser.id });
});
答案 3 :(得分:0)
终于得到了确切的原因:
在我的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此引用帮助我更好地理解它:)