启动一个最简单的 GraphQL API 服务器|Graphql专题
# 一个简单的 GraphQL API

schema.graphql
graphql 自带一组默认标量类型,包括 Int,Float,String,Boolean,ID。在定义字段时需要注明类型,这也是 graphql 的特点之一,是支持强类型的。如果非空,就在类型后面跟上一个!号。graphql 还包括枚举类型,列表和自定义类型。
type Hello {
id: ID!
name: String!
}
connector
编写完 schema 之后,graphql 知道有哪些数据了,但他还需要知道 “如何去取”, connector 的角色就在于此。 connector 的职责就是 “取数”, 他既可以调用 rpc 接口取数,又可以调用内置的 orm 插件去取数,还可以直接调用 egg 的 service。
export default class HelloConnector {
hellos() {
return [
{
id: 1,
name: 'Jack',
},
{
id: 2,
name: 'Lucy',
},
];
}
}
resolver
resolve.js是数据类型的具体实现,依赖connector.js完成。其实 resolver 非常简单,就是针对你暴露的查询接口,调用相应的connector去取数即可,如下:
export default {
Query: {
hellos(_root: any, {}, { connector }) {
return connector.hello.hellos();
},
},
};
定义 Query
新建一个 query 目录创建 schema.graphql 文件,大家也可以直接在各个模块下的 schema.graphql 文件中定义,纯属个人习惯
type Query {
hellos: [Hello!]
}
[Hello!] 可以理解为 [{id: 1, name: ‘jack’}, {id: 2, name: ‘praise’}] Hello! 可以理解为 {id: 1, name: ‘jack’}
项目启动
egg本地开发环境启动方式非常简单:
$ npm run dev
我们在浏览器中输入 http://127.0.0.1:7001/graphql 是类似下面这种界面说明已经 graphql 服务已经跑起来了。这是 graphql 自带的开发者工具页面,这个开发者工具可以满足我们绝大部分的调试工作,很是方便。

完成一次查询

结果的顺序也是按照你输入的顺序排序的,定制化的数据,完全根据你查什么返回什么结果。这就是 GraphQL 被称作 API 查询语言的原因。
如果你对返回的名称不满意,还可以设置别名:

请求流程

通过上方的例子我们可以看出客户端发送请求会被 graphql 解析,根据映射关系找到对应的 resolver。路由将数据传递到对应的 resolver,resolver 去调用对应的 connector 进行处理,connector 再调用 service 进行数据库处理。
