Почему ember-data 2.7.0 normalizeHelper ожидает ответа API JSON от моего пользовательского адаптера?

У меня есть проект Ember-Cli, который использует адаптер JSONAPI, через adapters/application.js, Я хочу добавить модельный класс, который должен использовать 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 с несоответствующим адаптером? Я понимаю, что могут возникнуть проблемы, если модели будут пытаться взаимодействовать (например, отношения "есть один / принадлежит" и т. Д.), Но такой вещи не существует. Я просто пытаюсь добавить новую модель, которая не поддерживается моим API-интерфейсом REST (JSON-API).

Ember: 2.7.2
Встроить данные: 2.7.0

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, Это определяется store а также ember-data сам. Смотрите спецификацию API.

Не давайте посмотрим, что делает этот код от вас:

serializers/widget.js
import LSSerializer from 'ember-localstorage-adapter';

export default LSSerializer.extend({
    normalizeResponse: function(store, modelClass, payload, id, requestType) {
        return payload;
    }
});

Вы на самом деле возвращаете адаптер, где вы реализуете normalizeResponse функция. Это делает его действительным сериализатором, который ничего не делает! Вы непосредственно возвращаете то, что отвечает вашим адаптером, который, кажется, не является допустимым JSONAPI. Вот почему возникает эта ошибка.

Другие вопросы по тегам