點燈坊

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

使用 Apollo GraphQL 建立 Argument

Sam Xiao's Avatar 2019-10-19

GraphQL 的 Query 除了回傳資料外,也能如 Function 般傳入 Argument。

Version

macOS Catalina 10.15
WebStorm 2019.2.3
Node 10.16.3
Apollo GraphQL 2.9.6

Apollo GraphQL

src/index.js

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

let data = [
  { id: 1, title: 'FP in JavaScript', price: 100 },
  { id: 2, title: 'RxJS in Action', price: 200 },
  { id: 3, title: 'Speaking JavaScript', price: 300 }
]

let typeDefs = gql`
  type Query {
    bookById(id: Int!): Book
  }

  type Book {
    id: Int
    title: String
    price: Int
  }
`;

let bookById: (_, { id }) => data.find(x => x.id === id)

let resolvers = {
  Query: {
    bookById
  }
};

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

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

第 3 行

let data = [
  { id: 1, title: 'FP in JavaScript', price: 100 },
  { id: 2, title: 'RxJS in Action', price: 200 },
  { id: 3, title: 'Speaking JavaScript', price: 300 }
]

data 為 array of object。

10 行

type Query {
  bookById(id: Int!): Book
}

在 schema 內定義了 bookById query,根據傳入 id 回傳特定 Book type object,idInt,後面加上 ! 表示 id 不可為 null

14 行

type Book {
  id: Int
  title: String
  price: Int
}

定義 Book type,包含 object 內的 idtitleprice

21 行

let bookById: (_, { id }) => data.find(x => x.id === id)

Apollo GraphQL 的 resolver 依序有 4 個 argument: parentargscontextinfo,讀取 argument 只會用到第二個 args,而 parent 目前用不到可用 _ 表示, contextinfo 目前可忽略。

GraphQL Playground

query {
  bookById(id: 1) {
    id
    title
  }
}

使用 bookById query,argument 傳入 id: 1,只回傳 idtitle 兩個 field 即可。

argument000

GraphQL 傳入 id: 1 查詢,且僅要求傳回 idtitle 而已,並沒有回傳 price

Conclusion

  • 可在 resolver 的第二個 argument 直接解構取得 query 的 argument

Reference

Apollo Docs, Fetching data with resolvers