GraphQL 模式
GraphQL架构是任何GraphQL服务器实现的核心。它描述了连接到它的客户端应用程序可用的功能。我们可以使用任何编程语言来创建GraphQL架构并围绕它构建一个接口。
GraphQL运行时定义了一个通用的基于图形的模式,以发布它所代表的数据服务的功能。客户端应用程序可以在其功能内查询架构。这种方法将客户端与服务器分离,并允许它们独立发展和扩展。
在本章中,我们使用Apollo服务器来执行GraphQL查询。graphql-tools中的makeExecutableSchema函数可帮助您绑定模式和解析器。
makeExecutableSchema函数语法
所述makeExecutableSchema函数采用对象类型的单个参数{}。使用此函数的语法如下 -
import { makeExecutableSchema } from 'graphql-tools';
const jsSchema = makeExecutableSchema({
typeDefs,
resolvers, // optional
logger, // optional
allowUndefinedInResolve = false, // optional
resolverValidationOptions = {}, // optional
directiveResolvers = null, // optional
schemaDirectives = null, // optional
parseOptions = {}, // optional
inheritResolversFromInterfaces = false // optional
});
序号 | 参数和描述 |
---|---|
1 |
类型定义 这是必需的论点。它将GraphQL查询表示为UTF-8字符串。 |
2 |
解析器 这是一个可选参数(默认情况下为空对象)。它具有处理查询的函数。 |
3 |
记录仪 这是一个可选参数,可用于将错误打印到服务器控制台。 |
4 |
parseOptions 这是一个可选参数,允许在将typeDefs指定为字符串时自定义解析。 |
5 |
allowUndefinedInResolve 默认情况下这是真的。设置为false时,如果返回undefined,则会导致resolve函数抛出错误。 |
6 |
resolverValidationOptions 这是一个可选参数,接受具有Boolean属性的对象。 |
7 |
inheritResolversFromInterfaces 这是一个可选参数,接受一个布尔参数来检查解析器对象继承。 |
插图
让我们创建一个简单的应用程序来理解这个模式。这将创建一个架构,用于查询服务器中的学生列表。学生数据将存储在一个平面文件中,我们将使用一个名为notarealdb的节点模块伪造数据库并从平面文件中读取。
步骤1 - 下载并安装项目所需的依赖项
创建名为schema-app的文件夹。从终端将目录更改为schema-app。然后,按照“环境设置”一章中说明的步骤3到5完成下载和安装过程。
第2步 - 创建架构
在项目文件夹schema-app中添加schema.graphql文件并添加以下代码
type Query {
greeting:String
students:[Student]
}
type Student {
id:ID!
firstName:String
lastName:String
password:String
collegeId:String
}
架构的根将是查询类型。该查询有两个字段 - greeting和Students分别返回String和学生列表。Student被声明为Object类型,因为它包含多个字段。ID字段声明为非可空。
第3步 - 创建解析器
在项目文件夹中创建文件resolvers.js并添加以下代码
const db = require('./db')
const Query = {
greeting:() => {
return "hello from TutorialsPoint !!!"
},
students:() => db.students.list()
}
module.exports = {Query}
问候和学生是处理查询的解析器。学生解析器功能从数据访问层返回学生列表。要访问模块外部的解析器函数,必须使用module.exports导出Query对象。
第4步 - 运行应用程序
创建server.js文件并参考环境设置章节中的步骤8。下一步是在终端中执行命令npm start。服务器将在9000端口上启动并运行。在这里,我们使用GraphiQL作为客户端来测试应用程序。打开浏览器并输入URL,http://localhost:9000/graphiql
。
在编辑器中键入以下查询
{
greeting
students {
id
firstName
lastName
}
}
查询将显示输出,如下所示
注 - 我们可以用RESTful API调用替换students.json来检索学生数据,甚至可以检索像MySQL或MongoDB这样的真实数据库。GraphQL成为原始应用程序层的一个薄包装器,以提高性能。
Resolver 是一组函数,可为 GraphQL 查询生成响应。简单来说,解析器充当 GraphQL 查询处理程序。GraphQL架构中的每个解析器函数都接受四个位置参数,如下所示:fieldName:(root, ...