Ошибка возврата обещания от 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-сервером?