首页 文章

GraphQL,Apollo:创建有效的模式

提问于
浏览
0

我最近开始用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类别 .

我该如何改进?

1 回答

  • 1

    您可以从编写可能类别的GraphQL枚举开始 .

    enum Category { ONEPIECE NARUTO }
    

    由于这两种漫画书具有相同的结构,因此您可以使用单个GraphQL类型来表示它们 . 我们将合并我们刚写的类别,以便您可以分辨出哪一个 .

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

    有点标准convention for retrieving arbitrary GraphQL objects by their ID;虽然它来自Facebook 's Relay Javascript client it'并没有特别依赖于该客户端,我会在这里使用它 .

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

    这将取代您的顶级查询,以按ID检索特定类型的图书;你可以写一个像这样的查询

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

    现在你有了类别枚举,你也可以编写一个顶级查询来返回可能按类别过滤的漫画书

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

    有一些相应的代码更改,使这项工作;我可能首先将两个漫画书列表合并为一个,并在那里添加类似的类别字段 .

    完成此操作后,如果添加第三个类别,则需要将其添加到枚举中并将其添加到数据集中,但您不需要对代码,GraphQL架构或查询 .

相关问题