7 定义GraphQL架构之创建查询类型

在上一篇中,我们讨论了如何搭建一个基本的 GraphQL 服务器,包括设置服务器与中间件。现在,我们将进入 GraphQL 的核心部分:定义架构。在这一篇中,我们专注于如何创建查询类型,让客户端能够根据需求请求数据。

了解GraphQL查询类型

在 GraphQL 中,查询类型负责处理对数据的读取请求。它定义了客户端可以请求哪些数据,以及如何组织这些数据。查询类型是 GraphQL 架构的一个重要组成部分,通常是我们与 API 交互的第一步。

创建查询类型

要定义查询类型,我们首先需要使用 GraphQL 提供的类型系统。下面是一个简单的例子,我们将构建一个图书管理系统的查询类型。

假设我们有以下需求:

  1. 能够查询所有图书的列表。
  2. 能够根据图书的 ID 查询特定图书的信息。

Step 1: 定义图书类型

首先,我们需要定义一个图书类型。我们可以使用 GraphQLObjectType 来实现。

1
2
3
4
5
6
7
8
9
10
11
const { GraphQLObjectType, GraphQLString, GraphQLList, GraphQLSchema, GraphQLID } = require('graphql');

// 定义图书类型
const BookType = new GraphQLObjectType({
name: 'Book',
fields: () => ({
id: { type: GraphQLID },
title: { type: GraphQLString },
author: { type: GraphQLString }
})
});

在上述代码中,我们定义了一个名为 Book 的类型,该类型包含三个字段:idtitleauthor。这让我们可以在查询中请求图书的这些属性。

Step 2: 创建查询类型

接下来,我们将创建查询类型,该类型将允许我们获取一个图书列表和单个图书。我们将其定义为一个新的 GraphQLObjectType

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: {
books: {
type: new GraphQLList(BookType),
resolve(parent, args) {
// 这里可以调用数据库或API获取图书数据
return Book.find({});
}
},
book: {
type: BookType,
args: { id: { type: GraphQLID } },
resolve(parent, args) {
// 通过ID查询特定的图书
return Book.findById(args.id);
}
}
}
});

在此代码中,我们创建了一个名为 RootQueryType 的查询对象。它包含两个字段:

  • books:返回一个图书列表。
  • book:根据图书的 id 返回单个图书。

resolve 函数是每个字段处理请求的地方。通常,这里我们会与数据库进行交互,例如使用 Mongoose 来获取数据。

Step 3: 定义GraphQL架构

最后,我们将定义整个 GraphQL 架构,结合我们的查询类型。

1
2
3
const schema = new GraphQLSchema({
query: RootQuery
});

此时,我们已经定义了一个基本的 GraphQL 查询架构,可以在服务器中使用。

测试查询

接下来,您可以使用 GraphQL IDE(如 GraphiQLApollo Client)来测试我们的查询。您可以发送以下查询以获取书籍列表:

1
2
3
4
5
6
7
{
books {
id
title
author
}
}

或者可以使用 ID 查询特定的图书:

1
2
3
4
5
6
{
book(id: "1") {
title
author
}
}

这将返回对应的图书数据。

总结

在本篇中,我们学习了如何定义 GraphQL 查询类型,并实现了一个图书管理系统的基本查询功能。我们定义了 BookTypeRootQueryType,并编写了对应的 resolve 方法以处理查询请求。

在下一篇文章中,我们将介绍如何定义图形查询中的变更类型,进一步增强我们的 API 功能。希望您在这次学习中获得了启发,继续探索 GraphQL 的深层次特性!

7 定义GraphQL架构之创建查询类型

https://zglg.work/graphql-api-dev-zero/7/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论