點燈坊

失くすものさえない今が強くなるチャンスよ

使用 Apollo GraphQL 建立 Enumeration Type

Sam Xiao's Avatar 2019-10-19

ECMAScript 沒有 enum,而 Strongly Typed 的 GraphQL 則支援 enum,讓我們在 GraphQL Playground 可直接選擇 Enumeration 值使用,且還可檢查 Query 的 Argument 值是否正確。

Version

macOS Catalina 10.15
WebStorm 2019.2.3
Node 10.16.3
Apollo GraphQL 2.9.6

Apollo GraphQL

src/index.js

import { ApolloServer, gql } from 'apollo-server'

let data = [
  { title: 'FP in JavaScript', category: 'FP'},
  { title: 'RxJS in Action', category: 'FRP'},
  { title: 'Speaking JavaScript', category: 'JS'}
]

let typeDefs = gql`
  type Query {
    books(category: BookCategory!): [Book]
  }

  type Book {
    title: String
    category: BookCategory
  }

  enum BookCategory {
    FP
    FRP
    JS
  }
`

let books = (_, { category }) => data.filter(x => x.category === category)

let resolvers = {
  Query: {
    books
  }
}

let apolloServer = new ApolloServer({ typeDefs, resolvers })

apolloServer
  .listen()
  .then(({ url }) => `GraphQL Server ready at ${ url }`)
  .then(console.log)

第 3 行

let data = [
  { title: 'FP in JavaScript', category: 'FP'},
  { title: 'RxJS in Action', category: 'FRP'},
  { title: 'Speaking JavaScript', category: 'JS'}
]

除了 title 外,還多了 category

19 行

enum BookCategory {
  FP
  FRP
  JS
 }

定義 BookCategory enum,其內包含 FPFRPJS 三種值。

enum 值建議使用大寫區別

14 行

type Book {
  title: String
  category: BookCategory
}

定義 Book type,categoryBookCategory enum。

10 行

type Query {
  books(category: BookCategory!): [Book]
}

定義 books query, 其 category argument 為 BookCategory enum。

28 行

let resolvers = {
  Query: {
    books
  }
}

resolvers 內定義 books query。

26 行

let books = (_, { category }) => data.filter(x => x.category === category)

實作 books resolver。

GraphQL Playground

query {
  booksByCategory(category: FP) {
    title
    category
  }
}

使用 booksByCategory query,可在 GraphQL Playgroud 以 ⌃ ␣ 選擇 FP 傳入,只回傳 titlecategory 兩個 field 即可。

enum000

Conclusion

  • enum 算我很喜歡的概念,可惜 ECMAScript 沒有,竟然在 GraphQL 得到救贖
  • GraphQL Playground 完美支援 enum,只要使用 ⌃ ␣ 就可選擇 enumeration 值

Reference

Eve Porcello, Query an Enumeration Type with GraphQL
Apollo Docs, Custom scalars and enums