如何从头构建 graphql api

2025-06-08

如何从头构建 graphql api

我在网上看过很多关于如何构建 graphql api 的教程,但不得不说,它们都缺少一点基础。所以,我打算把这篇教程分成两部分。第一部分会讲解什么是 graphql,并学习如何使用 express 和 graphql 搭建一个简单的服务器。

您将在本教程中学习的内容不仅适用于 JavaScript 使用者,因为我将确保带您了解基础知识,并且您可以继续查看其他语言的库并开始构建在此处获得的知识。

第二部分将进入高级阶段,我们将实际构建一个完整的 API,并使用 Postman 和 GraphIQL 接口进行测试。希望在本教程结束时,您能够为正在开发的任何应用或想要启动的新项目构建自己的 API。那就让我们开始吧。

GraphQL 只是一种查询语言,适用于你正在构建的任何 API。我所说的查询语言,指的是一种与 API 本身交互的方式,而不是像我们过去听到“查询”这个词时那样,与数据库交互。如果你编程经验丰富,我知道你在使用 SQL(标准查询语言)数据库(例如 MYSQL 和 POSTGRESQL)时一定遇到过查询。我们习惯使用上面提到的标准语言来查询数据库,例如

我想你还记得类似的事情,现在这允许我们在需要时选择我们需要的数据。当使用 SQL 从数据库检索数据时,我们可以灵活地获取我们需要的数据,而不会超过所需数据。但是,如果你熟悉 REST API,你就会意识到,当你向端点发送 GET 或 POST 请求时,数据通常以 JSON 格式提供给你。REST API 发送的大部分数据不会被客户端使用,但会消耗带宽。这是 graphql 通过允许你像使用 SQl 一样查询你的 API 来解决的问题之一。现在你已经了解了它的工作原理,我将带你了解使用 graphql 时最常使用的术语。

使用 GraphQL 时,你对单个端点的所有请求都将是 POST 请求。我知道你想知道如何像在 REST 架构中那样获取数据。这就引出了“查询”这个术语。查询用于从你的 API 获取数据。但是,如果你不能在服务器端操作数据,那么 API 还有什么用呢?所以这就引出了“修改”这个术语。修改就像 REST 架构中的 POST、DELETE 和 PUT。还有其他术语,例如订阅和片段,但本教程将重点介绍查询和修改,但你也可以在“了解更多关于 GraphQL 的信息”页面上阅读相关内容。

现在你已经了解了这些术语,让我们立即看一些代码。这是我最喜欢的部分。我假设你了解一些 JS 和 Node。如果你不了解,请留言,我的下一篇文章将带你了解 Node 的基础知识。首先,我们使用 Node 和 Express 创建一个服务器。你可以在任何你觉得合适的工作区中创建一个新文件夹,因此请打开你的目录,或者使用 cmd 创建一个新文件夹。

为应用程序创建目录后,在地址栏中运行“cmd”(假设您在 Windows 上打开该文件夹中的命令行。

让我们用 npm init 开始一个新项目

只需使用默认值,最后你应该会得到类似这样的结果

之后,让我们通过在同一目录中运行以下命令来安装我们需要的所有软件包

您还可以安装 body-parser 包将我们的请求转换为 json

Express 是节点的流行框架,graphql 是我们刚才讨论的,express-graphql 包含一些我们将用来构建服务器和 api 的重要模块,mongoose 将帮助我们轻松连接到我们的 mongodb 数据库。

然后,您可以使用您喜欢的 IDE 打开新创建的项目,并创建一个名为 index.js 的新文件(如果您使用 npm init 的默认设置),或者在 package.json 文件中将其命名为 main 的文件。创建文件后,我们使用 express 在该文件中创建一个简单的服务器。例如

现在你已经用 graphql 设置好了 Express 服务器。Express 用于启动我们的服务器,我们需要 Express graphql 中的 graphql http 作为我们 API 的中间件。它将处理所有发送到指定 graphql 路由的请求。在导入的 graphqlhttp 模块中,我们将提供 graphql 使用的选项。其中一些是 schema,它让 graphql 知道我们将如何查询数据以及我们希望数据是什么样子。另一个选项是 root 值,它将接受我们所有的解析器,也就是允许我们在 graphql 中创建和操作数据的函数。另一个有用的选项是“graphiql”,当我们在浏览器中导航到“graphql”路由时,它使我们能够使用界面与我们的 API 进行交互。现在让我们添加这些选项。

在上面的 gist 中,我们可以看到 schema 和 graphiql 选项已经添加到代码中。schema 是 graphql 成功运行的必要条件,因为只有这样,graphql 才能理解我们对即将构建的 API 的请求。因此,我创建了一个名为 DefineSchema 的函数,它主要定义了我们的 schema。schema 中有一个从 graphql 包导入的“buildSchema”。它将使用我们传入的字符串来构建 schema。

MainQuery 是一个 GraphQL 对象类型,它有一个名为 library 的字段。该字段的类型为字符串,这意味着该字段只能包含字符串,其后的感叹号表示该字段不可为空。因此,每当我们在 API 中查询 library 时,都会返回一个空数组来表明它是空的,或者 API 会根据该字段的内容返回一个字符串数组。

还有一个 getlibrary 函数用于获取图书馆中的书籍,由于我们尚未连接数据库,因此它目前只是一个数组。查询中模式的名称应该与 rootValue 中函数键的名称匹配,这将有助于 graphql 了解您的需求并准确获取。因此,我们在查询中添加的模式类型越多,我们在 rootValue 中添加的映射函数就越多。模式定义数据,rootValue 获取数据。

因此,如果您使用 Node 启动服务器并导航到 graphql 路由,您应该会看到这个简单的界面,它允许您与刚刚创建的 API 进行交互。目前,它的功能不多,但我希望您能够理解它的工作原理。这应该是您在“/graphql”路由中看到的内容。

现在让我们查询新的 graphql api,并使用 GraphQL 模式语言获取我们图书馆中的书籍。

从这个查询和花括号开始,下一级就是 rootValue 中指定的名称,也就是获取数据的函数。如果你在新的 graphql explorer 中输入代码,应该会调用 getlibrary 函数,并返回 books 作为数据。因此,使用相同的路由,我们可以声明另一个模式和根值,并轻松查询它,这就是 graphql 的强大之处。希望你喜欢本教程并学到一些东西。下一部分我们将继续构建一个功能齐全的 API,用于存储和检索 mongodb 数据库中的数据。下篇文章再见。如有任何疑问或评论,请在 Twitter 上与我联系 @AugustusOtu。分享到你的朋友圈。

快乐编码......现在再见

鏂囩珷鏉ユ簮锛�https://dev.to/augani/how-to-build-a-graphql-api-from-scratch-19c0
PREV
您可能错过的有关 JSON 的一些事项 JSON 的属性 JSON 对象的基本用法 自定义 Stringify 和 Parse 的行为 深度复制对象
NEXT
如何使用 Python 调用 DeepSeek-R1 API?深入的分步指南