为什么 ember-data 2.7.0 normalizeHelper 期望来自我的自定义适配器的 JSON API 响应?
Why is ember-data 2.7.0 normalizeHelper expecting a JSON API response from my custom adapter?
我有一个 ember-cli 项目,它通过 adapters/application.js
使用 JSONAPI 适配器。我想添加一个应该使用 ember-localstorage-adapter
的模型 class。我声明模型和相应的适配器和序列化器:
models/widget.js
import DS from 'ember-data';
export default DS.Model.extend({...});
adapters/widget.js
import LSAdapter from 'ember-localstorage-adapter';
export default LSAdapter.extend({});
serializers/widget.js
import LSSerializer from 'ember-localstorage-adapter';
export default LSSerializer.extend({});
并在我的路线中加载此模型:
routes/index.js
import Ember from 'ember';
export default Ember.Route.extend({
model() {
return this.store.findAll('widget');
}
});
这 应该 工作,但我得到一个缺少函数类型的错误:
ember.debug.js:19755 TypeError: serializer.normalizeResponse is not a function
at normalizeResponseHelper (serializer-response.js:80)
at finders.js:147
at Object.run (ember.debug.js:295)
at Class._adapterRun (store.js:2056)
at finders.js:146
at tryCatch (ember.debug.js:52052)
at invokeCallback (ember.debug.js:52067)
at publish (ember.debug.js:52035)
at ember.debug.js:41262
at invoke (ember.debug.js:991)
好的,我补充缺少的方法:
serializers/widget.js
import LSSerializer from 'ember-localstorage-adapter';
export default LSSerializer.extend({
normalizeResponse: function(store, modelClass, payload, id, requestType) {
return payload;
}
});
现在错误是关于负载的:
ember.debug.js:19755 Error: Assertion Failed: normalizeResponse must return a valid JSON API document:
* One or more of the following keys must be present: "data", "errors", "meta".
at new Error (native)
at Error.EmberError (../assets/vendor.js:30247:21)
at assert (../assets/vendor.js:17276:13)
at Object.assert (../assets/vendor.js:30059:34)
at assert (../assets/vendor.js:97498:37)
at normalizeResponseHelper (../assets/vendor.js:107520:39)
为什么这样断言?我不能将 JSON API 适配器与不合格的适配器混合搭配使用吗?我知道如果模型试图处理(例如 has-one/belongs-to 等关系)可能会出现问题,但没有这样的事情。我只是想添加一个不受我的后端支持的新模型(JSON-API 符合)REST api.
Ember: 2.7.2
嵌入数据:2.7.0
首先你的导入是错误的!
不是
import LSSerializer from 'ember-localstorage-adapter';
但是
import {LSSerializer} from 'ember-localstorage-adapter';
这是因为 ember-localstorage-adapter
中的导出:
import LSAdapter from 'ember-localstorage-adapter/adapters/ls-adapter';
import LSSerializer from 'ember-localstorage-adapter/serializers/ls-serializer';
export {
LSAdapter,
LSSerializer
};
export default LSAdapter;
使用 import LSSerializer from 'ember-localstorage-adapter';
导入 default
导出,它不是序列化程序。
接下来您需要了解 ember-data
在内部使用 JSONAPI
文档。序列化器的功能是序列化适配器正在读取的任何内容 JSONAPI
。这是由 store
和 ember-data
本身定义的。见 API specification.
不让我们看看您的这段代码在做什么:
serializers/widget.js
import LSSerializer from 'ember-localstorage-adapter';
export default LSSerializer.extend({
normalizeResponse: function(store, modelClass, payload, id, requestType) {
return payload;
}
});
您实际上是在 return 一个实现 normalizeResponse
功能的适配器。这使它成为一个有效的序列化器,什么都不做!您直接 return 适配器响应的内容,这似乎不是有效的 JSONAPI。这就是发生此错误的原因。
我有一个 ember-cli 项目,它通过 adapters/application.js
使用 JSONAPI 适配器。我想添加一个应该使用 ember-localstorage-adapter
的模型 class。我声明模型和相应的适配器和序列化器:
models/widget.js
import DS from 'ember-data';
export default DS.Model.extend({...});
adapters/widget.js
import LSAdapter from 'ember-localstorage-adapter';
export default LSAdapter.extend({});
serializers/widget.js
import LSSerializer from 'ember-localstorage-adapter';
export default LSSerializer.extend({});
并在我的路线中加载此模型:
routes/index.js
import Ember from 'ember';
export default Ember.Route.extend({
model() {
return this.store.findAll('widget');
}
});
这 应该 工作,但我得到一个缺少函数类型的错误:
ember.debug.js:19755 TypeError: serializer.normalizeResponse is not a function
at normalizeResponseHelper (serializer-response.js:80)
at finders.js:147
at Object.run (ember.debug.js:295)
at Class._adapterRun (store.js:2056)
at finders.js:146
at tryCatch (ember.debug.js:52052)
at invokeCallback (ember.debug.js:52067)
at publish (ember.debug.js:52035)
at ember.debug.js:41262
at invoke (ember.debug.js:991)
好的,我补充缺少的方法:
serializers/widget.js
import LSSerializer from 'ember-localstorage-adapter';
export default LSSerializer.extend({
normalizeResponse: function(store, modelClass, payload, id, requestType) {
return payload;
}
});
现在错误是关于负载的:
ember.debug.js:19755 Error: Assertion Failed: normalizeResponse must return a valid JSON API document:
* One or more of the following keys must be present: "data", "errors", "meta".
at new Error (native)
at Error.EmberError (../assets/vendor.js:30247:21)
at assert (../assets/vendor.js:17276:13)
at Object.assert (../assets/vendor.js:30059:34)
at assert (../assets/vendor.js:97498:37)
at normalizeResponseHelper (../assets/vendor.js:107520:39)
为什么这样断言?我不能将 JSON API 适配器与不合格的适配器混合搭配使用吗?我知道如果模型试图处理(例如 has-one/belongs-to 等关系)可能会出现问题,但没有这样的事情。我只是想添加一个不受我的后端支持的新模型(JSON-API 符合)REST api.
Ember: 2.7.2
嵌入数据:2.7.0
首先你的导入是错误的!
不是
import LSSerializer from 'ember-localstorage-adapter';
但是
import {LSSerializer} from 'ember-localstorage-adapter';
这是因为 ember-localstorage-adapter
中的导出:
import LSAdapter from 'ember-localstorage-adapter/adapters/ls-adapter';
import LSSerializer from 'ember-localstorage-adapter/serializers/ls-serializer';
export {
LSAdapter,
LSSerializer
};
export default LSAdapter;
使用 import LSSerializer from 'ember-localstorage-adapter';
导入 default
导出,它不是序列化程序。
接下来您需要了解 ember-data
在内部使用 JSONAPI
文档。序列化器的功能是序列化适配器正在读取的任何内容 JSONAPI
。这是由 store
和 ember-data
本身定义的。见 API specification.
不让我们看看您的这段代码在做什么:
serializers/widget.js
import LSSerializer from 'ember-localstorage-adapter';
export default LSSerializer.extend({
normalizeResponse: function(store, modelClass, payload, id, requestType) {
return payload;
}
});
您实际上是在 return 一个实现 normalizeResponse
功能的适配器。这使它成为一个有效的序列化器,什么都不做!您直接 return 适配器响应的内容,这似乎不是有效的 JSONAPI。这就是发生此错误的原因。