Проблема структурирования свойства объекта с помощью [apollo / graphql] - PullRequest
0 голосов
/ 04 февраля 2020

Проблема

Привет друзья,

Я работаю над API, используя Apollo Server. У меня проблема с отображением свойства nextEpisodeDate только один раз. Мое решение показывает nextEpisodeDate во всех подмассивах в свойстве episodes, и это не должно быть так.

Я надеюсь, что кто-то может мне помочь!

JSON Пример

"episodes": [
   {
     "nextEpisodeDate": "2020-01-17"
   },
   {
     "episode": 3,
     "id": "53789/dorohedoro-3",
     "imagePreview": "https://cdn.animeflv.net/screenshots/3274/3/th_3.jpg"
   },
   {
     "episode": 2,
     "id": "53755/dorohedoro-2",
     "imagePreview": "https://cdn.animeflv.net/screenshots/3274/2/th_3.jpg"
   },
   {
     "episode": 1,
     "id": "53705/dorohedoro-1",
     "imagePreview": "https://cdn.animeflv.net/screenshots/3274/1/th_3.jpg"
   }
 ]

typeDefs

const resolvers = require('./resolvers');
const {gql} = require('apollo-server');

const typeDefs = gql `
  extend type Query{
    latest_anime: [Animes]
  }

  type Animes{
    title: String
    poster: String
    synopsis: String
    debut: String
    type: String
    rating: String
    genres: [String]
    episodes: [Episodes]
  }

  type Episodes{
    nextEpisodeDate: String
    episode: String
    id: String
    imagePreview: String
  }
`

module.exports = {
  typeDefs,
  resolvers
};

Площадка Apollo

query{
  latest_anime{
    title
    poster
    synopsis
    debut
    type
    rating
    genres
    episodes{
      nextEpisodeDate
      episode
      id
      imagePreview
    }
  }
}

Выход игровой площадки Apollo

{
  "data": {
    "latest_anime": [
      {
        "title": "Tsugumomo OVA",
        "poster": "https://animeflv.net/uploads/animes/covers/3275.jpg",
        "synopsis": "OVA 4.6Kazuya Kagami nunca va a ningún lado sin su preciada “Sakura Obi” que su madre le regaló. Un día, una hermosa chica vestida con un kimono llamada Kiriha aparece ante él. Naturalmente, ella comienza a vivir en su habitación. ¿Naturalmente? ¡Esto solo es el inicio de la embarazosa y confusa...",
        "debut": null,
        "type": "OVA",
        "rating": "4.6",
        "genres": [
          "accion",
          "comedia",
          "ecchi",
          "escolares",
          "seinen",
          "sobrenatural"
        ],
        "episodes": [
          {
            "nextEpisodeDate": null,
            "episode": null,
            "id": null,
            "imagePreview": null
          },
          {
            "nextEpisodeDate": null,
            "episode": "1",
            "id": "53753/tsugumomo-ova-1",
            "imagePreview": "https://cdn.animeflv.net/screenshots/3275/1/th_3.jpg"
          }
        ]
      },
    ]
  }
}

1 Ответ

0 голосов
/ 05 февраля 2020

Единственный способ получить желаемую структуру ответа - это два разных типа. Поле должно иметь ровно один тип, но вы можете использовать абстрактный тип, такой как объединение или интерфейс, чтобы каждый отдельный элемент в списке во время выполнения преобразовывался в один из нескольких типов.

type AiredEpisode implements Episode {
  id: String
  episode: String
  imagePreview: String
}

type UpcomingEpisode implements Episode {
  id: String
  nextEpisodeDate: String
}

interface Episode {
  id: String
}

type Anime {
  episodes: [Episode]
  # other fields
}

затем запросите эпизоды следующим образом:

query {
  latest_anime {
    episodes {
      # fields on the interface itself like id are common to all
      # implementing types so they don't need to be inside a fragment
      id
      # fields specific to one of the types need to be inside a fragment
      ... on UpcomingEpisode {
        nextEpisodeDate
      }
      ... on AiredEpisode {
        id
        episode
        imagePreview
      }
    }
  }
}

Примечание: если ваш API не возвращает id для предстоящих эпизодов, вы все равно должны предоставить его (например, вы можете использовать идентификатор шоу , вы просто хотите убедиться, что он уникален). Это гарантирует, что вы не столкнетесь с проблемами кэширования, если будете использовать клиент, такой как Apollo, в клиентской части.

...