【问题标题】:Why is ember-data 2.7.0 normalizeHelper expecting a JSON API response from my custom adapter?为什么 ember-data 2.7.0 normalizeHelper 期望来自我的自定义适配器的 JSON API 响应?
【发布时间】:2016-09-07 13:03:49
【问题描述】:

我有一个通过 adapters/application.js 使用 JSONAPI 适配器的 ember-cli 项目。我想添加一个应该使用ember-localstorage-adapter 的模型类。我声明了模型以及相应的适配器和序列化器:

 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 适配器与不合格的适配器混合并匹配吗?我知道如果模型尝试进行交互(例如,拥有一个/属于等关系)可能会出现问题,但没有这样的事情。我只是想添加一个不受我的后端(符合 JSON-API 的)REST api 支持的新模型。

余烬:2.7.2
嵌入数据:2.7.0

【问题讨论】:

  • 顺便说一句,我知道简单地返回 {data: payload} 将使我的有效负载 JSON-API 兼容,我的问题不是如何,而是为什么

标签: ember.js ember-data ember-local-storage


【解决方案1】:

首先你的导入是错误的!

不是

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 的任何内容。这是由storeember-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;
    }
});

您实际上是在返回一个实现normalizeResponse 函数的适配器。这使它成为一个有效的序列化程序,什么都不做!您直接返回适配器响应的内容,这似乎不是有效的 JSONAPI。这就是发生此错误的原因。

【讨论】:

  • 谢谢,import {LSSerializer} 实际上解释了我看到的许多时髦行为。我使用适配器作为序列化器,我必须在其上实现serialize,因为它实际上不是序列化器...... d'oh。现在这一切都是开箱即用的。至于 JSONAPI 是事实上的内部格式,我不知道,但现在一切都说得通了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 2016-08-06
相关资源
最近更新 更多