作为 graphql
的入门章节,这里用 graphql
对单表的查询作为案例对 graphql
的基本结构进行讲解说明。
图中 Query
与 Author Schema
部分
通过 graphql-tool
,我们可以将数据结构以及查询结构的定义放在 .graphql
文件中(编辑器或IDE亦支持相应的语法高亮),并可以直接用于相应 schema
对象的构建。
定义 Author
的数据结构并针对该结构定义相应的查询:
# path: scripts/base1/schema.graphql
# Author 表
type Author {
id: Int! # 该类型为 int,加上 ! 表示该字段是必需的
nickname: String
}
# 查询表
type Query {
authorById(id: Int!): Author
authorByNickname(nickname: String): Author
author(id: Int!, nickname: String): Author
}
除了定义包含两个字段的 Author
的数据结构外,后续还定义了针对 Author
的三个查询(通过 id
,通过 nickname
以及通过 id
或 nicknam
的查询),查询的结果都是返回 Author
对象
图中 resolvers
部分
在经过 Query
规则解析查询语句后,相应的查询对象就会传递给 resolvers
,resolvers
定义了接受到相应的查询对象后对数据源的查询与整理规则,resolvers
会将查询整理好的数据返回。
数据源:
// path: scripts/base1/base1.js
const authors = [
{ id: 1, nickname: 'aaa', plus: 'plus1' },
{ id: 2, nickname: 'bbb' },
{ id: 3, nickname: 'ccc' }
];
resolvers
部分:
// path: scripts/base1/base1.js
const resolvers = {
Query: {
authorById: (blank, select) => _.find(authors, select),
authorByNickname: (blank, select) => _.find(authors, select),
author: (blank, select) => _.find(authors, select)
}
};
这里使用了模拟的数据 authors
作为数据源,在 resolvers
中定义了相应查询中所进行的具体取数操作。
使用 graphql-tool
提供的 makeExecutableSchema
方法配合上述的数据/查询结构以及相应的 resolvers
即可构建可供操作的 schema
对象。
构建 schema
对象部分:
// path: scripts/base1/base1.js
const graphqlTools = require('graphql-tools');
// 通过文件读取的方式载入 graphql schema 的配置
const typeDefs = fs.readFileSync('./schema.graphql').toString();
...
// 构建可供操作的 schema 对象
const schema = graphqlTools.makeExecutableSchema({
typeDefs: typeDefs,
resolvers: resolvers
});
// path: scripts/base1/base1.js
// 通过 id 查询 author
const queryById = `
query {
authorById(id: 2) {
id
nickname
}
}
`;
graphql(schema, queryById).then((result) => {
// result = {
// "data": {
// "authorById": {
// "id": 2,
// "nickname": "bbb"
// }
// }
// }
});
详细代码可以参考 /scripts/base1 目录