在构建现代 web 应用程序时,GraphQL 是不可或缺的技术。它提供了一个强大的查询语言和服务端执行引擎,以便客户端可以轻松地请求和获取数据。虽然 GraphQL 最初是由 Facebook 开发的,但现在它已经成为一个通用的规范,被广泛应用于各种 web 应用程序。
在本篇文章中,我们将学习如何使用 Deno 构建 GraphQL 服务器。Deno 是一种新的 JavaScript 运行时环境,具有更好的安全性和模块化,并且可以在没有 Node.js 的情况下运行。我们将会学习如何使用一些最流行的库,如 Oak、Deno DB 和 GraphQL Helix 来构建一个完整的 GraphQL 服务器。
什么是 GraphQL?
GraphQL 是一种用于 web 应用程序中的查询语言和服务端执行引擎。它提供了一个强大的类型系统,以便开发人员可以定义所需数据的类型和结构。客户端可以使用 GraphQL 查询语言请求数据,服务端解析并返回请求的数据。
GraphQL 的最大好处之一是,它可以控制返回的数据量,以避免过多或缺乏所需的数据。它还可以缩短请求和响应之间的距离,使应用程序更快。
GraphQL 组件
GraphQL 应用程序通常由三个主要组件组成:
Schema - GraphQL 的 schema 定义了数据类型和结构。它有助于开发人员定义所需数据的结构,并且客户端可以使用查询语言请求数据。
Resolvers - Resolvers 负责解析客户端请求,并在必要时从数据源中检索数据。GraphQL 将请求路由到正确的 resolver,并将数据组装到所请求的结构中。
型处理程序 (Type Handlers) - Type Handlers 可以在 resolver 响应之前或之后修改响应数据。它们通常用于转换数据和添加元数据。
准备工作
在我们开始构建 GraphQL 服务器之前,我们需要确保 Deno 和一些依赖项已经安装好。我们需要安装以下依赖项:
Oak - 用于构建 web 服务器的框架。
Deno DB - 用于与数据库交互的 Deno ORM 库。
GraphQL Helix - 用于构建 GraphQL 服务器的库。
可以使用以下命令在 Deno 中安装这些依赖项:
deno install --allow-net --allow-read --allow-env --import-map=import_map.json <dependency>
步骤 1: 创建模型和数据库
首先,我们需要创建模型和数据库。我们将使用 Deno DB 来与数据库进行交互。
我们将使用 Post
模型来表示帖子,它具有 id
、title
和 content
属性。
创建名为 models.ts
的文件,并将以下代码添加到该文件中:
-- -------------------- ---- ------- ------ - ------ --------- - ---- ------------------------------------ ------ ----- ---- ------- ----- - ------ ----- - -------- ------ ---------- - ----- ------ ------ - - --- - ----- --------------- ----------- ----- ------------- ----------------- -- ------ ----------------- -------- --------------- -- -
接下来,我们需要创建数据库。我们将使用 SQLite 数据库,并将其保存在 data.db
文件中。
创建名为 db.ts
的文件,并将以下代码添加到该文件中:
-- -------------------- ---- ------- ------ - --------- ---------------- - ---- ------------------------------------ ------ - ---- - ---- -------------- ----- --------- - --- ------------------ --------- ------------ --- ----- -- - --- -------------------- ---------------- ----- --------- ----- ---- ---
在上面的代码中,我们创建了一个名为 connector
的 SQLite3 连接器,并将其连接到名为 data.db
的文件。我们还通过 db.link()
方法将 Post
模型与数据库连接起来。最后,我们使用 db.sync()
方法将模型同步到数据库中。
步骤 2: 创建 GraphQL Schema
接下来,我们需要创建一个 GraphQL schema。GraphQL schema 定义了数据类型和结构。
创建名为 schema.ts
的文件,并将以下代码添加到该文件中:
-- -------------------- ---- ------- ------ - ------------------ -------------- -------------- ------------ --------------- - ---- ---------------------------------- ------ - ---- - ---- -------------- ----- -------- - --- ------------------- ----- ------- ------- -- -- -- --- - ----- ------------- -- ------ - ----- ------------- -- -------- - ----- ------------- -- --- --- ----- --------- - --- ------------------- ----- -------- ------- - ------ - ----- --- ---------------------- -------- ----- -- -- - ------ ----- -------------------- -- -- ----- - ----- --------- ----- - --- - ----- ----------------------------- -- -- -------- ----- -------- ----- -- - ----- - -- - - ----- ------ ----- ---------------- ------------ -- -- -- --- ------ ----- ------ - --- --------------- ------ ---------- ---
在上面的代码中,我们创建了一个 PostType
GraphQLObjectType,它定义了 Post
模型的类型和结构。我们还创建了一个 RootQuery
GraphQLObjectType,它包含了两个查询字段:posts
和 post
。posts
字段返回所有帖子的数组,而 post
字段接受 id
参数,并返回指定的帖子。
最后,我们将 RootQuery
添加到 GraphQL schema 中,并将其导出。
步骤 3: 创建 Resolvers
接下来,我们需要创建 resolver。Resolver 负责解析客户端请求,并在必要时从数据源中检索数据。
创建名为 resolvers.ts
的文件,并将以下代码添加到该文件中:
-- -------------------- ---- ------- ------ - ---- - ---- -------------- ------ ----- --------- - - ------ - ----- ------- - ----- ----- - ----- -------------------- ------ ------ -- ----- ------------ - -- -- - ----- ---- - ----- ---------------- ------------ ------ ----- -- -- --------- - ----- ------------------ - ------ ------- -- - ----- ---- - ----- ------------- ------ -------- --- ------ ----- -- ----- ------------------ - --- ------ ------- -- - ----- ---- - ----- ---------------- ------------ -- ------- - ----- --- ----------- ---- -- ----- ---- --- -------- - ---------- - ------ ------------ - -------- ----- -------------- ------ ----- -- ----- ------------------ - -- -- - ----- ---- - ----- ---------------- ------------ -- ------- - ----- --- ----------- ---- -- ----- ---- --- -------- - ----- -------------- ------ ----- -- -- --
在上面的代码中,我们创建了一个 resolvers
对象,其中包含了 Query
和 Mutation
字段的解析器。Query
字段具有 posts
和 post
解析器,用于返回所有帖子和单个帖子。Mutation
字段具有 createPost
、updatePost
和 deletePost
解析器,用于创建、更新和删除帖子。
步骤 4: 创建 GraphQL Server
现在,我们已经定义了 GraphQL schema 和 resolvers,我们需要将这些组件连接起来,并创建我们的 GraphQL 服务器。
创建名为 server.ts
的文件,并将以下代码添加到该文件中:
-- -------------------- ---- ------- ------ - ----------- - ---- --------------------------------- ------ - -------------- - ---- --------------------------------------------------------------------------- ------ - -------------------- - ---- ---------------------------------------- ------ - ------ - ---- -------------- ------ - --------- - ---- ----------------- ----- --- - --- -------------- ----- ---------------- - ---------------------- --------- ------ --- ------------- ----- -- - ----- ------------------------ ------- ----------------- -------- ---- ---------- --- --- ------------------- ------- -- ------------------------- ----- ------------ ----- ---- ---
在上面的代码中,我们创建了一个 Oak 应用程序,并将 GraphQL 服务作为中间件挂载到应用程序上。我们还使用 makeExecutableSchema()
方法将 schema
定义转换为可执行的 schema。最后,我们在端口 8080
上启动服务器。
步骤 5: 运行服务器
现在我们可以启动服务器并测试我们的 GraphQL API。
可以使用以下命令运行服务器:
deno run --allow-net --allow-read --allow-env server.ts
GraphQL 服务器已经启动,现在我们可以在浏览器中访问 GraphQL Playground。
在浏览器中输入 http://localhost:8080/graphql
,打开 GraphQL Playground。
在 Playground 中,我们可以查询和变异我们的 API。使用以下查询返回所有帖子:
{ posts { id title content } }
使用以下查询返回指定的帖子:
{ post(id: "6e202e6f-d78b-4df6-b8d1-1fcee04ae9e7") { id title content } }
使用以下变异创建新的帖子:
mutation { createPost(title: "New post title", content: "New post content") { id title content } }
使用以下变异更新现有的帖子:
mutation { updatePost(id: "6e202e6f-d78b-4df6-b8d1-1fcee04ae9e7", title: "Updated post title", content: "Updated post content") { id title content } }
使用以下变异删除现有的帖子:
mutation { deletePost(id: "6e202e6f-d78b-4df6-b8d1-1fcee04ae9e7") { id title content } }
总结
Den,GraphQL Helix 和 Deno DB 是三个强大的工具,在构建 GraphQL 服务器方面具有非常好的帮助。在本文中,我们已经学习了如何将它们结合在一起,构建了一个完整的 GraphQL 服务器。我们了解了如何定义 GraphQL schema、编写 resolver、创建数据库,以及创建 Web 服务器来处理来自客户端的请求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645df51b968c7c53b0050256