GraphQL是一种用于 API 的查询语言,它提供了一种基于数据的API设计方法,让前端可以精确地查询自己所需要的数据。在现代Web应用中,GraphQL已经成为了非常热门的技术之一。本文将介绍如何在Fastify上实现GraphQL。
什么是Fastify
Fastify是一个快速和低开销的Web框架,它旨在为web开发人员提供出色的性能和开发体验。Fastify主要特点如下:
- 十分简洁,代码逻辑简单
- 非常快速,基于Node.js的事件循环
- 插件式架构,可提供灵活的扩展
- 支持Promises/A+规范的API
- 支持错误处理和日志
使用Fastify实现GraphQL
安装Fastify
在开始使用Fastify来实现GraphQL之前,我们需要先安装Fastify。先在终端中进入项目所在目录,使用npm安装Fastify:
npm i fastify
安装GraphQL相关依赖
除了Fastify之外,我们还需要安装GraphQL相关依赖。执行以下命令:
npm i fastify-graphql graphql
编写GraphQL服务
我们现在可以开始编写GraphQL服务了。首先,我们需要引入Fastify和GraphQL,然后使用Fastify来创建一个HTTP服务器,代码如下:
const fastify = require('fastify')(); const { graphql, graphiql } = require('fastify-graphql');
然后,我们需要定义GraphQL模式,模式定义了数据模型、数据类型、查询和变更。我们这里使用demo模式,模式中包括了查询、类型、数据和枚举。代码如下:
-- -------------------- ---- ------- ----- ------ - - ---- ----- - ------ ------- - ---- ---- - --- ---- ----- ------- ------ ------- - ---- -------- - -------------- ----- ----- -------- ------ --------- ---- - ---- ------ - ---- ------ ------- - --
在我们的示例中,我们定义了一个查询hello、一个用户类型User,一个变更createUser,以及一个枚举类型Gender。
最后,我们可以使用Fastify公开GraphQL服务并启动Fastify实例:
-- -------------------- ---- ------- ------------------------- - ------- --------- ----- --- -------------------- --- -- - -- ----- ----- ---- ------------------- --------- -- ----------------------------------- ---
这里我们使用了Fastify正式开放的GraphQL插件。我们将我们之前定义的schema传递给该插件,graphiql参数启用了GraphQL的浏览器端应用程序。
使用GraphQL服务
现在我们的GraphQL服务已经启动,在浏览器中访问localhost:3000/graphql,将会看到一个GraphQL互动式的客户端调试工具。尝试向其发送数据查询,下面是我们测试的样例:
query { hello }
我们向GraphQL请求hello查询,GraphQL返回了一个带有hello属性的响应:
{ "data": { "hello": "world" } }
实现用户接口
用demo模式很难满足实际应用中的要求,现在我们简单的模拟了一个简单的模式。接下来,我们将使用一个实际的示例来说明如何在Fastify上使用GraphQL来实现用户接口。
首先,我们将定义一个User对象:
class User { constructor(id, name, email, gender) { this.id = id; this.name = name; this.email = email; this.gender = gender; } }
然后,我们需要一个数据存储到一个数组中,该数组将被查询和变更所使用:
const data = [ new User(1, 'Alice', 'alice@abc.com', 'FEMALE'), new User(2, 'Bob', 'bob@abc.com', 'MALE'), new User(3, 'Carol', 'carol@abc.com', 'FEMALE'), new User(4, 'Dave', 'dave@abc.com', 'MALE'), new User(5, 'Eve', 'eve@abc.com', 'UNKNOWN'), ];
现在我们已经有了数据,我们可以使用GraphQL来查询和变更该数据。首先,我们来定义查询hello:
const Query = ` type Query { hello: String! getUser(id: Int!): User getUsersByGender(gender: Gender!): [User!] } `;
这里我们引入了两种新概念:getUser和getUsersByGender。这些查询可以返回一个User对象或一个查询User对象的数组。
现在我们来实现getUser和getUsersByGender这两个查询:
-- -------------------- ---- ------- ----- --------- - - ------ -- -- - ------ ------- -------- -- -------- ------ -- - ----- -- - -------- ------ ----------- -- ---- --- ---- -- ----------------- ------ -- - ----- ------ - ------------ ------ ------------- -- -------- --- -------- -- --
我们可以看到,根查询模式的“hello”查询返回了一个字符串。getUser查询使用args获取ID参数,并且在数据中查找相应的对象。getUsersByGender查询接受Gender参数并返回满足条件的所有用户。
现在我们需要定义变更createUser来创建一个新的用户:
const Mutation = ` type Mutation { createUser(id: Int!, name: String!, email: String!, gender: Gender!): User } `;
和查询类似,我们定义了一个Mutation类型,并定义了一个createUser变更,这个变更接受4个参数。
现在我们来实现createUser变更:
-- -------------------- ---- ------- ----- ------------ - - ----------- ------ -- - ----- ---- - --- ----- -------- ---------- ----------- ----------- -- ---------------- ------ ----- -- --
此处很简单,我们只需获取args参数,创建User对象,将其添加到数据中并返回。
最后,我们将所有查询、变更和类型组成模式:
-- -------------------- ---- ------- ----- ------ - - -------- ----------- ---- ---- - --- ---- ----- ------- ------ ------- ------- ------- - ---- ------ - ---- ------ ------- - -- ----- -------- - - ------ ---------- --------- ------------- --
现在我们的GraphQL示例服务已经可以使用了。启动服务器并访问localhost:3000/graphql,使用我们之前定义的查询和变更模式进行测试。
-- -------------------- ---- ------- -------- - ----------- --- -- ----- -------- ------ ---------------- ------- ---- - - --- ----- ------ ------ - - ----- - ----------- -- - -- ---- ----- ------ - ------------------------ ------- - -- ---- ----- ------ - -
总结
在本文中,我们介绍了如何在Fastify上实现GraphQL,提供了一种快速开发API的方法。使用Fastify和GraphQL,你可以快速地构建一个API,并使用GraphQL清晰的查询语言来获取所需的数据。我们还提供了一个完整的示例,展示了如何使用GraphQL在Fastify中实现用户接口。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64b1044948841e9894d4e09c