大家好,GraphQL 是一个可以让 Client 弹性要求资料的技术,本文章将介绍Apollo Server,他是一个以 GraphQL 规範设计的 Server,并且可以套用 Node.js 现今大家常用的 Express、Fastify 等 Server 的 Middleware。
本文章以 Appollo 官网的getting-started撰写。
请先 clone 程式範例,以下会以程式範例讲解。
你需要安装
DockerDocker-Compose先将 demo run 起来
先将 Server 运行起来会比较有感觉,
$ cd ./week36$ docker-compose up --build
打开localhost:4000
,会看到 GraphQL 的测试页面,
输入以下,并点选中间的运行按钮,
{ books { title author }}
将会获得以下资料,
{ "data": { "books": [ { "title": "The Awakening", "author": "Kate Chopin" }, { "title": "City of Glass", "author": "Paul Auster" } ] }}
如果不使用测试页面来测试,也可以使用一般的 Curl、Postman 来测试,要特别注意的是,request 端的 query 实际上是一个字串,并不是一个 object
实作
创建 node 专案并且安装 Apollo 相关套件
$ npm init --yes$ npm install apollo-server graphql
让我们来看看index.js发生了什么事,
定义了 GraphQL 的 schema,
const typeDefs = gql` type Book { title: String author: String } type Query { books: [Book] }`;
type Book
: 定义有一个Book
物件,拥有 title 与 author 的栏位,并且都是 Stringtype Query
: 定义有哪些查询
的方法,此範例拥有books
方法,并且会返回複数或零个Book
物件设定假资料,
const books = [ { title: "The Awakening", author: "Kate Chopin", }, { title: "City of Glass", author: "Paul Auster", },];
实作查询中的books
方法,此处的方法非常简单,就是直接把假资料回传而已,而实战中,此处可以设计去 DB 或者其他 Microservice 捞取资料,
const resolvers = { Query: { books: () => books, },};
以 schema 的typeDefs
、实作的resolvers
来创建ApolloServer
,并启动,
const server = new ApolloServer({ typeDefs, resolvers });server.listen().then(({ url }) => { console.log(`? Server ready at ${url}`);});