По мере того, как я погружаюсь все глубже и глубже в процесс создания приложений Ember.js, я натыкаюсь на другую стену.
До того, как я с большим успехом использовал Mirage — я просто копировал вывод из API, который я хотел создать, в приборы Mirage, и он отлично работал.
Теперь у меня проблема с тем, чтобы заставить его работать с реальным API.
Сначала я отключил мираж в config/environment.js.
ember g adapter filter
import ApplicationAdapter from './application';
export default ApplicationAdapter.extend({
findAll: function(store, type, label) {
var url = `${this.host}/${this.namespace}/${type.modelName}`;
console.log(`${url}`);
return this.ajax(url, 'GET');
},
});
Адаптер приложения выглядит так
import DS from 'ember-data';
export default DS.JSONAPIAdapter.extend({
host: 'http://127.0.0.1:1234',
namespace: 'api',
headers: Ember.computed(function(){
return {"secret": "1234"};
})
});
И таким образом, когда я вхожу /filter app/routes/filter/index
import Ember from 'ember';
export default Ember.Route.extend({
model() {
return this.store.findAll('filter');
}
});
Я вижу, что URL-адрес построен нормально, как http://127.0.0.1:1234/api/filter
, и нет 404, но я получаю сообщение об ошибке
Error while processing route: filter.index The adapter operation was aborted EmberError@http://127.0.0.1:4200/assets/vendor.js:29616:15
и поскольку я не полностью понимаю ноу-хау Ember Inspector, я пытаюсь как-то понять это
Моя модель фильтра, которая работала раньше (с миражом), выглядит так:
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr(),
url: DS.attr()
});
API возвращает список [{"id":1, "name": "namex", "url": "http://"},{"id":2, "name": "namey", "url": "http://"}]
Я уверен, что API возвращает данные так, как это не «фильтрует», поскольку раньше у меня были проблемы с множественным числом.
Изменить: ЭТО РЕШАЕТ ПРОБЛЕМУ
import DS from 'ember-data';
export default DS.RESTSerializer.extend(
{
normalizeFindAllResponse(store, type, payload)
{
var data = [];
payload.forEach(
function(item, index, enumerable)
{
var ob = {};
Ember.set(ob, 'id', item.id);
Ember.set(ob, 'type', 'filter');
Ember.set(ob, 'attributes', item);
data[index]=ob;
console.log(data[index]);
}
);
return {
data: data
};
}
});
Это почти исправление, но не совсем. Я могу получить доступ к некоторым атрибутам модели, таким как имя, но есть объект массива с 3 массивами внутри, 2 из них являются массивами, один посередине - Getter (что бы это ни было), и я не могу получить к нему доступ, поскольку это больше не массив. Поэтому я не уверен, правильно ли он привязывается к объекту таким образом. Также я не мог ничего сделать с «данными», потому что независимо от того, какой RESTAdapter здесь и там я ставил, он игнорировал его и запрашивал объект с атрибутом data/meta/errors... не знаю, ошибка это или нет.