GraphQL, Apollo: создание эффективной схемы - PullRequest
0 голосов
/ 09 декабря 2018

Я недавно начал изучать разработку серверов с GraphQL и Apollo.В приведенном ниже коде формула для извлечения каждого из данных несколько понятна.

schema.js

const { gql } = require('apollo-server');
const _ = require('lodash');

const onepieces = [
  {
    "id": "onepiece1",
    "title": "원피스 1권",
    "price": "1,360",
    "desc": "동터오는 모험의 시대"
  },
  {
    "id": "onepiece2",
    "title": "원피스 2권",
    "price": "1,360",
    "desc": "대결 버기 해적단"
  }
];
const narutos = [
  {
    "id": "naruto1",
    "title": "나루토 1권",
    "price": "1,360",
    "desc": "나루토 모험의 시작"
  },
  {
    "id": "naruto2",
    "title": "나루토 2권",
    "price": "1,360",
    "desc": "나루토와 안개마을"
  }
];

const typeDefs = gql`  
    type Onepiece { id: ID, title: String, price: String, desc: String }
    type Naruto { id: ID, title: String, price: String, desc: String }

    type Query {
        onepiece(id: String!): Onepiece,
        naruto(id: String!): Naruto,
        getOnepieces: [Onepiece],
        getNarutos: [Naruto]
    }
`;

const resolvers = {
  Query: {
    onepiece: (parent, args) => _.find(onepieces, {id: args.id}),
    naruto: (parent, args) => _.find(narutos, {id: args.id}),
    getOnepieces: () => onepieces,
    getNarutos: () => narutos
  }
};

module.exports = { typeDefs, resolvers };

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

Например, я хотел бы управлять категориями Onepiece и Naruto в Comic Book.

Как я могу улучшить?

1 Ответ

0 голосов
/ 09 декабря 2018

Вы можете начать с написания перечисления GraphQL возможных категорий.

enum Category { ONEPIECE NARUTO }

Поскольку оба типа комиксов имеют одинаковую структуру, вы можете иметь один тип GraphQL для их представления.Мы включим только что написанную категорию, чтобы вы могли определить, какая из них.

type ComicBook implements Node {
  id: ID!
  category: Category!
  title: String!
  price: String!
  desc: String!
}

Существует несколько стандартное соглашение для извлечения произвольных объектов GraphQL по их идентификатору ;хотя он исходит из клиента Facebook Relay Javascript, он специально не привязан к этому клиенту, и я бы использовал его здесь.

interface Node {
  id: ID!
}
type Query {
  node(id: ID!): Node
}

Это заменит ваши запросы верхнего уровня для получения определенных видов книг по идентификатору;Вы можете написать запрос, например

{
  node(id: "naruto1") {
    ... on ComicBook { category title price desc }
  }
}

Теперь, когда у вас есть перечисление категории, вы также можете написать один запрос верхнего уровня, чтобы вернуть комиксы, возможно отфильтрованные по категории

type Query {
  comicBooks(category: Category): [ComicBook!]!
}
{
  comicBooks(category: ONEPIECE) { id title price desc }
}

Есть некоторые соответствующие изменения кода, чтобы сделать эту работу;Я бы, вероятно, начал с объединения двух списков комиксов в один и добавления там аналогичного поля категории.

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

...