Ошибка возврата обещания от Ember Data

Я работаю над своим первым приложением Ember и заставил его отображать, как я хотел, с маршрутом, возвращающим статический объект JSON из model():

element: {
  name: "First Element",
  divisions: [{
    name: "First Division",
    sets: [{name: "Set 1"},{name: "Set 2"},{name: "Set 3"}]
  }, {
    name: "Second Division",
    sets: [{name: "Set 1"},{name: "Set 2"},{name: "Set 3"}]
  }]
}

Сейчас я пытаюсь сделать рефакторинг для использования Ember Data + Mirage и провожу время ужасно.

Вот мой index.js маршрут

export default Ember.Route.extend({
    model() {
        return this.store.find('element', 1);
    },

Если я настрою свой Мираж config.js как это:

  this.get('/elements', function() {
    return {
      elements: [
          {
            id: 1,
            name: 'First Element',
            divisions: [1, 2]
          }
      ]
    }
  });

тогда я получаю эту ошибку:

Your Ember app tried to GET '/elements/1', but there was no route defined to handle this request.

Если я настрою свой Мираж config.js как это:

  this.get('/elements/1', function() {
    return {
       id: 1,
       name: 'First Element',
       divisions: [1, 2]
    }
  });

тогда я получаю эту ошибку:

22:46:40.883 "Error while processing route: index" "Assertion Failed: normalizeResponse must return a valid JSON API document:
    * One or more of the following keys must be present: "data", "errors", "meta"." "EmberError@http://localhost:4200/assets/vendor.js:25582:15

РЕДАКТИРОВАТЬ:

Так что это не решение проблемы, как указано, но это помогло мне преодолеть это. Я разочаровался в Pretender и снова начал создавать настоящий Rails-сервер в соответствии с этим превосходным руководством: http://emberigniter.com/modern-bridge-ember-and-rails-5-with-json-api/

Я смог сделать все, что хотел, таким образом, и если я когда-нибудь захочу сделать это рабочим приложением, я буду намного ближе.

2 ответа

Решение

Поэтому проблема в том, что вы на самом деле не придерживаетесь спецификации JSON API. Вы можете решить эту проблему, прочитав страницу Мираж о том, как соответствовать.

По сути, вам нужно либо вернуть объект на верхнем уровне вашего ответа JSON в случае GET /foo/1 вызов. Вам также нужно изменить атрибут "elements" на "data" для GET /foo и это должно сработать. Прямо сейчас нет простого, многократно используемого способа сделать этот Мираж из коробки. Лучшая ставка сейчас на оба вопроса - использовать решение, представленное в этом выпуске.

тлеющая ошибка normalizeResponse must return a valid JSON API document
можно исправить тремя способами

вернуть действительный ответ JSONAPI

см. ваше сообщение об ошибке:

normalizeResponse должен возвращать действительный документ JSON API:
* Должен присутствовать один или несколько из следующих ключей: «данные», «ошибки», «мета».

        this.get('/elements/1', function() {
    return {
      data: {
        id: 1,
        name: 'First Element',
        divisions: [1, 2]
      }
    }
  });

см. также https://jsonapi.org/examples/

нормализовать все ответы

      // app/serializers/application.js

import EmberData from "ember-data";

export default EmberData.JSONAPISerializer.extend({
    normalizeResponse() {
        return {
            data: this._super(...arguments),
        };
    },
    //normalize(){},
    //serialize(){},
    // ...
});

проблема: обработка ошибок

завернув все ответы в { data: ... }, они никогда не возвращают ошибки

при ошибках ответ должен быть

        this.get('/elements/1', function() {
    return {
      errors: [
        {
          id: 12345,
          title: 'title for error #12345'
        }
      ]
    }
  });

см. также https://jsonapi.org/format/#error-objects

замените JSONAPI на REST

      sed -i 's/JSONAPISerializer/RESTSerializer/g' app/serializers/*.js
sed -i 's/JSONAPIAdapter/RESTAdapter/g' app/adapters/*.js

ember docs: адаптеры и сериализаторы

дубликат: как можно интегрировать приложение ember для использования с json-сервером?

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