如何在 Deno 应用中使用 GraphQL

阅读时长 13 分钟读完

如何在 Deno 应用中使用 GraphQL

Deno 是一种新型的运行时环境,与 Node.js 相比,它更加安全、高效和易于使用。在 Deno 应用中,我们可以使用 GraphQL 来查询和更新数据。在本文中,我们将详细介绍如何在 Deno 应用中使用 GraphQL,包括如何配置和定义 GraphQL Schema,如何处理查询和变更请求,如何连接数据库和如何使用 Deno GraphQL 工具集,以及如何使用 GraphQL Playground 进行调试和测试。

GraphQL 简介

GraphQL 是一种面向 API 的查询语言,它由 Facebook 开发,并于 2015 年首次发布。与传统的 RESTful API 相比,GraphQL 具有以下优势:

  1. 更灵活的数据查询和更新方式:客户端可以精确地指定需要获取的数据字段和类型,从而减少网络流量和响应时间。

  2. 更好的类型安全和错误处理:GraphQL 采用了强类型的查询语言和返回值,可以避免常见的类型错误和异常。

  3. 更好的文档和工具支持:GraphQL 可以自动生成 API 文档和客户端代码,并且有许多第三方工具和插件可以增强开发效率和质量。

GraphQL 架构

GraphQL 采用了基于类型的架构,它由三个主要组件组成:Schema、Resolvers 和 Query(或 Mutation 或 Subscription)。下图展示了 GraphQL 架构的基本结构:

-- -------------------- ---- -------
-- ------- ------
---- ----- -
  -- -----------
  ------ --------
  -------- ----- ----
-

---- -------- -
  -- -----------
  ----------------- ------------ -----
  -------------- ---- ------ ------------ -----
  -------------- ----- ---
-

---- ---- -
  -- ---------
  --- ---
  ------ -------
  -------- -------
  ---------- ---------
-

----- --------- -
  ------ -------
  -------- -------
-

Schema 定义了 API 的类型和字段,Resolvers 定义了每个字段的实际执行方式,Query 定义了查询请求和返回类型,Mutation 定义了变更请求和返回类型。GraphQL 还支持 Subscription,用于处理推送式的数据更新。

Deno GraphQL 环境搭建

在 Deno 应用中使用 GraphQL,我们需要安装并配置 Deno GraphQL 工具集。首先,我们需要安装并配置 Deno:

然后,我们需要在 server.ts 文件中配置和启动 GraphQL 服务器:

-- -------------------- ---- -------
-- ----------
------ - ------------ ------ - ---- --------------------------------
------ - ------------- --- - ---- -----------------------------------------

-- -- ------- ------ - ---------
----- ----- - ----
  ---- ----- -
    -------- ------
  -
-
----- --------- - -
  ------ -
    -------- -- -- ------ -------
  -
-

-- -- ------- --- - ------
----- --- - --- -------------
----- ------ - --- --------

-- -- ------- ------
----- -------------- - ----- --------------
  --------- ------
  ---------- ---------
--
---------------------- ---------------------- --------------------------------

-- -------
------------------------
--------------------------------
----- ------------ ----- ---- --
------------------- ----- -- -------------------------------

在上述代码中,我们定义了一个简单的查询类型和 Resolver,然后使用 applyGraphQL 函数创建了 GraphQL 服务,并将其应用到 Oak HTTP 中间件和路由中。最后,我们使用 Oak 应用和路由器启动服务器,监听 3000 端口。

Deno GraphQL 连接数据库

在 Deno 应用中使用 GraphQL,通常需要连接数据库来存储和检索数据。我们可以在 Deno 应用中使用许多现代的数据库系统,例如 MongoDB、PostgreSQL、MySQL、SQLite 等。在本节中,我们将介绍如何使用 MongoDB 连接器和 Deno MongoDB 包来连接到 MongoDB 数据库。

首先,我们需要安装并配置 Deno MongoDB 包:

然后,我们需要定义和更新 GraphQL Schema 以使用 MongoDB 数据库:

-- -------------------- ---- -------
-- -- ------- ---- ------
------ - --- - ---- -----------------------------------------
----- ----- - ----
  ---- ---- -
    --- ----
    ------ --------
    -------- -------
  -
  ----- --------- -
    ------ --------
    -------- -------
  -
  ---- ----- -
    ------ ---------
    -------- ----- ----
  -
  ---- -------- -
    ----------------- ------------ ------
    -------------- ---- ------ ------------ ------
    -------------- ----- ---
  -
-

--------- --------- --- ------- ----

// 导入 MongoDB 包和定义 Resolvers import { ObjectId } from 'https://deno.land/x/mongo/bson.ts' const resolvers = { Query: { posts: async (parent: any, args: any, context: any, info: any) => { return context.db.post.find().toArray() }, post: async (parent: any, args: any, context: any, info: any) => { return context.db.post.findOne({ _id: ObjectId(args.id) }) } }, Mutation: { createPost: async (parent: any, args: any, context: any, info: any) => { const { title, content } = args.input const { insertedId } = await context.db.post.insertOne({ title, content }) const post = await context.db.post.findOne({ _id: insertedId }) return post }, updatePost: async (parent: any, args: any, context: any, info: any) => { const { id, input } = args const { title, content } = input await context.db.post.updateOne({ _id: ObjectId(id) }, { $set: { title, content } }) const post = await context.db.post.findOne({ _id: ObjectId(id) }) return post }, deletePost: async (parent: any, args: any, context: any, info: any) => { const { id } = args await context.db.post.deleteOne({ _id: ObjectId(id) }) return id } } }

query { posts { id title content } }

-- -------------------- ---- -------

----

--- ---- ------- -------

-------------
------ - ------------ ------ - ---- --------------------------------
------ - ------------- --- - ---- -----------------------------------------
------ - ----------- - ---- ----------------------------------
------ - -------- - ---- -----------------------------------

----- ----- - ----
  ---- ---- -
    --- ----
    ------ --------
    -------- -------
  -
  ----- --------- -
    ------ --------
    -------- -------
  -
  ---- ----- -
    ------ ---------
    -------- ----- ----
  -
  ---- -------- -
    ----------------- ------------ ------
    -------------- ---- ------ ------------ ------
    -------------- ----- ---
  -
-
----- --------- - -
  ------ -
    ------ ----- -------- ---- ----- ---- -------- ---- ----- ---- -- -
      ------ --------------------------------
    --
    ----- ----- -------- ---- ----- ---- -------- ---- ----- ---- -- -
      ------ ------------------------- ---- ----------------- --
    -
  --
  --------- -
    ----------- ----- -------- ---- ----- ---- -------- ---- ----- ---- -- -
      ----- - ------ ------- - - ----------
      ----- - ---------- - - ----- --------------------------- ------ ------- --
      ----- ---- - ----- ------------------------- ---- ---------- --
      ------ ----
    --
    ----------- ----- -------- ---- ----- ---- -------- ---- ----- ---- -- -
      ----- - --- ----- - - ----
      ----- - ------ ------- - - -----
      ----- --------------------------- ---- ------------ -- - ----- - ------ ------- - --
      ----- ---- - ----- ------------------------- ---- ------------ --
      ------ ----
    --
    ----------- ----- -------- ---- ----- ---- -------- ---- ----- ---- -- -
      ----- - -- - - ----
      ----- --------------------------- ---- ------------ --
      ------ --
    -
  -
-

----- ------ - --- -------------
----- -------------------------------------------
----- -- - ---------------------------
----- --- - --- -------------
----- ------ - --- --------

----- -------------- - ----- --------------
  --------- ------
  ---------- ----------
  -------- ----- -- -- -
    ------ -
      --
    -
  -
--
---------------------- ---------------------- --------------------------------

------------------------
--------------------------------
----- ------------ ----- ---- --
------------------- ----- -- -------------------------------

总结

在本文中,我们介绍了如何在 Deno 应用中使用 GraphQL,包括如何配置和定义 GraphQL Schema,如何处理查询和变更请求,如何连接数据库和如何使用 Deno GraphQL 工具集,以及如何使用 GraphQL Playground 进行调试和测试。使用 GraphQL,我们可以更加灵活地查询和更新数据,避免常见的类型错误和异常,并且可以提高开发效率和质量。我们希望本文能够为初学者提供指导和帮助,同时也欢迎读者在评论区留言或通过社交媒体与我们交流。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64816b2948841e98940df1aa

纠错
反馈