Связь с ошибкой получения 2 API - PullRequest
0 голосов
/ 11 мая 2018

У меня есть 2 API:

  1. http://example.api.com/api.json (этот файл имеет приблизительно 5 МБ)
  2. http://api.com/:itemId

1-йу одного есть все данные, которые мне нужны, например:

{
"realms": [
{"name":"Azralon","slug":"azralon"}],
"auctions": [
{"auc":828911977,"item":76139,"owner":"Bloodkina","bid":15294990,"buyout":16099990,"quantity":10,"timeLeft":"VERY_LONG"},
{"auc":828911979,"item":10000,"owner":"Bloodkina", "bid":15294990,"buyout":16099990,"quantity":100,"timeLeft":"VERY_LONG"},
{"auc":829305192,"item":98828,"owner":"Tempestivå","bid":15294990,"buyout":16099990,"quantity":5,"timeLeft":"VERY_LONG"},
{"auc":829305193,"item":98728,"owner":"Tempestivå", "bid":15294990,"buyout":16099990,"quantity":2,"timeLeft":"VERY_LONG"}
]}

2-й имеет имя Предметов, но он отвечает только когда я передаю itemId в качестве параметра.Например, элемент: 76139, например http://api.com/76139

{
    "id": 76139,
    "description": "",
    "name": "Wild Jade",
    "icon": "inv_misc_gem_x4_rare_uncut_green",
}

Я хочу показать имя элемента и владельца, но я получаю сообщение об ошибке, например <DS.PromiseObject:ember71726> im Поле моего элемента, поле владельца в порядке,Как я могу это сделать??(это API-интерфейс Blizzard для аукционов и предметов)

model / auction.js

import DS from 'ember-data';

export default DS.Model.extend({
  auc: DS.attr('number'),
  item: DS.belongsTo('item'), //items: DS.belongsTo('item'),
  owner: DS.attr('string'),
});

model / item.js

import DS from 'ember-data';

export default DS.Model.extend({
  auctions: DS.hasMany('auction'),
  name: DS.attr('string')
});

routs / index.js

import Route from '@ember/routing/route';

export default Route.extend({
  model(){
    return this.store.findAll('auction');
  }
});

маршруты / item.js

import Route from '@ember/routing/route';

export default Route.extend({
  model(params){
    return this.store.findRecord('item', params.item_id)
  },
});

сериализаторы / auction.js

import DS from 'ember-data';

export default DS.RESTSerializer.extend({
  normalizeResponse (store, primaryModelClass, payload, id, requestType) {
    return {
      realms: payload.realms,
      data: payload.auctions.map(ah=>{
        return {
        id: ah.auc,
        type:'auction',
        attributes: ah,
        //Added this
        relationships: {
          item:{
          data: {
          id: ah.item,
          type: 'item',
      }
    }
  }
        }
      })
    };
  }
});

сериализаторы / item.js

import DS from 'ember-data';

export default DS.JSONSerializer.extend({
  normalizeResponse (store, primaryModelClass, payload, id, requestType) {
    payload = {
      data : payload,
      id: payload.id,
      name: payload.name
    };
    return this._super(store, primaryModelClass, payload, id, requestType)
  }
});

templates / index.hbs

{{#each model as |auction|}}
<ul>
 <li>{{auction.items.name}}</li>
 <li>{{auction.quantity}}</li>
 <li>{{auction.bid}}</li>
 <li>{{auction.buyout}}</li>
 <li>{{auction.timeLeft}}</li>
 <li>{{auction.owner}}</li>
</ul>
{{/each}}

Error

1 Ответ

0 голосов
/ 15 мая 2018

Эй, Кас ? Я постараюсь ответить на этот вопрос как можно лучше, пытаясь описать некоторые проблемы, с которыми вы, вероятно, столкнулись на этом пути.У меня это работает локально, так что, надеюсь, я смогу рассказать, как вы можете заставить его работать на вашей стороне.

Во-первых, как я уже упоминал в своем комментарии, вы, похоже, не соответствовали вашему API, вашемумодель и ваш шаблон, когда дело дошло до того, как вы ссылались items.Вы должны убедиться, что каждый ключ правильный, чтобы они все совпадали.Вот мой внутренний респондент, моя модель и мой шаблон:

Внутренний респондент, использующий express-autoroute :

module.exports.autoroute = {
  get: {
    '/auctions': function getThings(req, res) {
      res.json({
        realms: [{
          name: 'Azralon',
          slug: 'azralon',
        }],
        auctions: [{
          auc: 828911977,
          item: 76139,
          owner: 'Bloodkina',
          bid: 15294990,
          buyout: 16099990,
          quantity: 10,
          timeLeft: 'VERY_LONG',
        },
        ...
      });
    },
  },
};

Аукционная модель (Ember)

import DS from 'ember-data';

export default DS.Model.extend({
  auc: DS.attr('number'),
  item: DS.belongsTo('item'),
  owner: DS.attr('string'),
});

Шаблон приложения (Ember)

{{#each model as |auction|}}
  <ul>
   <li>{{auction.item.name}}</li>
   <li>{{auction.quantity}}</li>
   <li>{{auction.bid}}</li>
   <li>{{auction.buyout}}</li>
   <li>{{auction.timeLeft}}</li>
   <li>{{auction.owner}}</li>
  </ul>
{{/each}}

Как вы можете видеть, бэкэнд отвечает item в качестве атрибута аукциона, модель использует item в качестве атрибутаимя и шаблон также доступ к ключу itemЭто то, что я имел в виду, когда сказал, что они должны соответствовать 10

Второе, что я заметил, это то, что ваш аукционист не говорит ничего об отношениях.Если вы посмотрите JSON: API spec , вы увидите, как должны быть определены отношения, то есть с объектом отношений

Я смог получить вашу вещьработая с использованием следующего кода:

Serializer аукциона (Ember)

import DS from 'ember-data';

export default DS.JSONAPISerializer.extend({
  normalizeResponse (store, primaryModelClass, payload, id, requestType) {
    return {
      realms: payload.realms,
      data: payload.auctions.map(ah => {
        return {
        id: ah.auc,
          type:'auction',
          attributes: ah,
          relationships: {
            item: {
              data: {
                id: ah.item,
                type: 'item',
              }
            }
          }
        }
      })
    };
  }
});

, как вы можете видеть, я строю объект отношений и проверяю, что ключ элемента соответствует .

Последней проблемой, которую я обнаружил, было то, что ваш сериализатор предметов не работал, я предполагаю, что это просто то, что вы не достигли этого, потому что вы успешно внедрили Аукцион Сериализатор.Вот моя реализация:

Item Serializer (Ember):

import DS from 'ember-data';

export default DS.JSONAPISerializer.extend({
  normalizeResponse (store, primaryModelClass, payload, id, requestType) {
    return {
      data : {
        attributes: payload,
        id: payload.id,
        type: 'item',
      },
    };
  }
});

Как я уже сказал, это работает для меня локально, но дайте мне знать, если у вас есть какие-либо проблемы ?

...