Skip to content

Latest commit

 

History

History
108 lines (86 loc) · 3.16 KB

1.graphql基础查询.md

File metadata and controls

108 lines (86 loc) · 3.16 KB

graphql 基础查询

作为 graphql 的入门章节,这里用 graphql 对单表的查询作为案例对 graphql 的基本结构进行讲解说明。

整体结构一览

docs/base1.png

数据结构与查询结构的定义

图中 QueryAuthor 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 以及通过 idnicknam 的查询),查询的结果都是返回 Author 对象

resolvers

图中 resolvers 部分
在经过 Query 规则解析查询语句后,相应的查询对象就会传递给 resolversresolvers 定义了接受到相应的查询对象后对数据源的查询与整理规则,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 中定义了相应查询中所进行的具体取数操作。

构建相应的 schema 对象

使用 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
});

使用 schema 对象进行查询操作

// 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 目录