GraphQL 是一种由 Facebook 发明的数据查询语言,它可以让客户端定义需要返回哪些数据,并且不会浪费带宽和服务器资源。Fastify 是一个低开销且高度效率的 Node.js web 框架。这篇文章将向你介绍如何使用 Fastify 构建一个 GraphQL API 服务。
准备工作
在开始之前,我们需要安装 Node.js 和 npm(或 yarn)。你可以通过以下链接下载和安装它们:
创建一个新的空目录,并在其中打开命令行终端。初始化该目录并安装必需的依赖:
npm init -y npm install fastify fastify-autoload fastify-cors fastify-gql graphql
- fastify — Fastify 的核心模块;
- fastify-autoload — 用于自动加载多个路由和插件;
- fastify-cors — 用于解决跨域资源共享 (CORS) 问题;
- fastify-gql — Fastify 的 GraphQL 插件;
- graphql — GraphQL 的 JavaScript 实现。
编写 API
首先,让我们创建一个 index.js
文件,并从导入 Fastify 和 Fastify 插件开始:
const fastify = require('fastify')({ logger: true }) const autoload = require('fastify-autoload') const cors = require('fastify-cors') const gql = require('fastify-gql')
然后,自动加载多个路由和插件:
fastify.register(autoload, { dir: `${__dirname}/routes`, })
在目录 ./routes
中,我们可以创建一个名为 graphql.js
的文件。该文件将包含我们 GraphQL API 的所有定义:
-- -------------------- ---- ------- -------------- - ----- -------- --------- ----- - ---------------------- --------------------- - ------- --------- ----- -- ------------------------ ----- ----- ------ -- - ---------------- ------------------------------- -------------------- -- -
在该文件中,我们注册了 Fastify CORS 插件以解决跨域问题。然后,我们使用 fastify-gql
插件创建 GraphQL API。最后,我们定义 /graphql
路由的处理程序,该处理程序将处理所有的 GraphQL 操作。
在接下来的部分中,我们将更详细地讨论 schema
对象,并提供一个完整的代码示例。
定义 schema
一个 GraphQL schema 定义了可以从 API 中获取的所有数据类型、查询、变异、订阅等。以下是一个简单的例子:
-- -------------------- ---- ------- ----- - ----------- - - ------------------ ----- ------ - ------------- ---- ----- - ------ ------ - -- -------------- - ------
在这个示例中,我们定义了一个名为 Query
的类型,其中包含一个名为 hello
的字段,其类型为 String
。
在实际项目中,我们通常会定义许多其他类型,例如 “User”、“Product”、“Order” 等等。这种复杂的类型定义可能需要使用 makeExecutableSchema
函数,该函数允许我们传递一个包含类型定义和一个可选的解析器对象的 JavaScript 对象。
-- -------------------- ---- ------- ----- - -------------------- - - ------------------------ ----- -------- - - ---- ---- - --- --- ----- ------- ------ ------- - ---- ----- - -------- ----- ---- --------- ------ - ---- -------- - ---------------- -------- ------ --------- ---- -------------- ---- ----- -------- ------ --------- ---- -------------- ----- ---- - - ----- --------- - - ------ - ----- -------- - -- -- -------- ----- -- --- --------- -------- ----- -------- ----- -- --- -- --------- - ----------- -------- - ----- ----- -- -------- ----- -- --- ----------- -------- - --- ----- ----- -- -------- ----- -- --- ----------- -------- - -- -- -------- ----- -- --- -- - ----- ------ - ---------------------- --------- ---------- -- -------------- - ------
在这个示例中,我们定义了三个类型:User
、Query
和 Mutation
。我们还提供了类型解析器的对象,该对象定义了这些类型的实际行为。例如,user
查询实际上应该查询数据库并返回一个用户对象。
编写解析器
我们在上一节中定义了一个 schema,但 schema 并不能充分发挥作用,因为 GraphQL 的类型解析器还没实现。在解析器中,我们需要定义每个 GraphQL 映射到的函数。
以查询 allUsers
为例。我们的 schema 如下:
type Query { allUsers: [User] }
我们需要添加该查询的解析器:
const resolvers = { Query: { allUsers: (parent, _, { db }, info) => db.findAll('User'), }, };
该解析器使用一个名为 db
的属性,它将连接到作为上下文传递的数据库。反过来,我们可以使用它来查询数据库并返回所需的数据。
完整的示例代码
以下是完整的代码示例:
index.js
-- -------------------- ---- ------- ----- ------- - -------------------- ------- ---- -- ----- -------- - --------------------------- ----- ---- - ----------------------- ----- --- - ---------------------- ----- ------ - ------------------- -------------------------- - ---- ---------------------- -- ---------------------- --------------------- - ------- --------- ----- -- ------------------------ ----- ----- ------ -- - ---------------- ------------------------------- -------------------- -- ----- ----- - ----- -- -- - --- - ----- -------------------- ------------------------ --------- -- ---------------------------------- - ----- ----- - ---------------------- --------------- - - -------
./routes/graphql.js
-- -------------------- ---- ------- -------------- - ----- -------- --------- ----- - ---------------------- --------------------- - ------- --------- ----- -- ------------------------ ----- ----- ------ -- - ---------------- ------------------------------- -------------------- -- -
./schema.js
-- -------------------- ---- ------- ----- - -------------------- - - ------------------------ ----- -------- - - ---- ----- - --------- ------ -------- ----- ---- - ---- -------- - ---------------- -------- ------ --------- ---- -------------- ---- ----- -------- ------ --------- ---- -------------- ----- ---- - ---- ---- - --- --- ----- ------- ------ ------- - - ----- --------- - - ------ - --------- -------- -- - -- -- -- ------------------- ----- -------- - -- -- - -- -- -- --------------- ---- -- --------- - ----------- -------- - ----- ----- -- - -- -- -- - ----- ---- - - ----- ----- - ------ ----------------- ----- -- ----------- -------- - --- ----- ----- -- - -- -- -- - ----- ---- - - --- ----- ----- - ------ ----------------- ----- -- ----------- -------- - -- -- - -- -- -- ----------------- ---- -- - ----- ------ - ---------------------- --------- ---------- -- -------------- - ------
结论
在本教程中,我们使用 Fastify 构建了一个 GraphQL API,并解释了如何使用 Fastify 的自动加载插件、CORS 插件和 GraphQL 插件来构建一个完整的 API 服务。我们还讨论了如何定义 GraphQL schema 和解析器,并提供了一个完整的示例代码。
尽管 GraphQL 只是近期出现的技术,但它已经广泛使用了,特别是在 React 和 Vue.js 等前端框架中。如果你正在寻找一种优秀的数据查询语言,那么 GraphQL 是一个很好的选择!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670a2b5fd91dce0dc87f5ba1