2021 年 9 月 27 日
使用 TypeScript、PostgreSQL、Next.js、Prisma 和 GraphQL 构建全栈应用:GraphQL API
本文是构建使用 Next.js、GraphQL、TypeScript、Prisma 和 PostgreSQL 构建全栈应用的课程的第二部分。在本文中,您将创建 GraphQL API 并在前端与之交互。

目录
- 介绍
- 克隆仓库
- 种子数据库
- 以传统方式构建 API:REST
- REST API 及其缺点
- GraphQL,REST 的替代方案
- 构建 GraphQL API
- 当前 GraphQL 设置的缺陷
- 使用 Pothos 的代码优先 GraphQL API
- 客户端 GraphQL 查询
- 分页
- 总结和后续步骤
介绍
在本课程中,您将学习如何构建“awesome-links”,一个全栈应用,用户可以在其中浏览精选链接列表并为他们喜欢的链接添加书签。
在上一部分中,您使用 Prisma 设置了数据库层。在本部分的末尾,您将了解 GraphQL:它是什么以及如何使用它在 Next.js 应用中构建 API。
开发环境
要继续学习本教程,您需要安装 Node.js 和 GraphQL 扩展。您还需要运行 PostgreSQL 实例。
注意:您可以本地设置 PostgreSQL,或在 Heroku 上托管实例。请注意,在本课程结束时的部署步骤中,您将需要远程数据库。
克隆仓库
您可以在 GitHub 上找到本课程的完整源代码。
注意:每篇文章都有一个对应的分支。这样,您就可以在阅读时进行跟进。通过检出 part-2 分支,您将拥有与本文相同的起点。
要开始使用,请导航到您选择的目录并运行以下命令以克隆仓库。
现在您可以导航到克隆的目录,安装依赖项并启动开发服务器
该应用将在 https://127.0.0.1:3000/
上运行,您将看到四个项目。数据是硬编码的,来自 /data/links.ts
文件。
种子数据库
设置 PostgreSQL 数据库后,将 env.example
文件重命名为 .env
,并设置数据库的连接字符串。之后,运行以下命令以创建迁移和数据库中的表
如果 prisma migrate dev
没有触发种子步骤,请运行以下命令以种子数据库
此命令将运行位于 /prisma
目录中的 seed.ts
脚本。此脚本使用 Prisma 客户端向数据库添加四个链接和一个用户。
项目结构和依赖项概览
您将看到以下文件夹结构
这是一个 Next.js 应用程序,其中设置了 TailwindCSS 和 Prisma。
在 pages
目录中,您将找到三个文件
_app.tsx
:全局App
组件,用于添加在页面更改之间持续存在的导航栏并添加全局 CSS。about.tsx
:此文件导出一个 React 组件,该组件渲染位于 https://127.0.0.1:3000/about 的页面。index.tsx
:主页,其中包含链接列表。这些链接在/data/links.ts
文件中硬编码。
接下来,您将找到一个 prisma
目录,其中包含以下文件
schema.prisma
:数据库的模式,以 PSL(Prisma 模式语言)编写。如果您想了解如何为此应用建模数据库,请查看本课程的上一部分。seed.ts
:将种子数据库与虚拟数据一起使用的脚本。
以传统方式构建 API:REST
在本课程的上一部分中,您使用 Prisma 设置了数据库层。下一步是在数据模型之上构建 API 层,这将允许您从客户端请求或发送数据。
一种常见的 API 结构方法是让客户端向不同的 URL 端点发送请求。服务器将根据请求类型检索或修改资源,并返回响应。这种架构风格称为 REST,它有几个优点
- 灵活:一个端点可以处理不同类型的请求
- 可缓存:您需要做的就是缓存特定端点的响应
- 客户端和服务器之间的分离:不同的平台(例如,Web 应用、移动应用等)可以使用 API。
REST API 及其缺点
虽然 REST API 提供了优点,但它们也有一些缺点。我们将使用 awesome-links
作为示例。
这是构建 awesome-links
的 REST API 的一种可能方式
资源 | HTTP 方法 | 路由 | 描述 |
---|---|---|---|
用户 | GET | /users | 返回所有用户及其信息 |
用户 | GET | /users/:id | 返回单个用户 |
链接 | GET | /links | 返回所有链接 |
链接 | GET 、PUT 、DELETE | /links/:id | 返回单个链接,更新或删除它。id 是链接的 id |
用户 | GET | /favorites | 返回用户的书签链接 |
用户 | POST | /link/save | 将链接添加到用户的收藏夹 |
链接 | POST | /link/new | 创建新链接(由管理员完成) |
每个 REST API 都不同
另一位开发人员可能会以不同的方式构建他们的 REST API,具体取决于他们认为合适的方式。这种灵活性是有代价的:每个 API 都不同。
这意味着每次使用 REST API 时,您都需要阅读其文档并了解
- 不同的端点及其 HTTP 方法。
- 每个端点的请求参数。
- 每个端点返回的数据和状态代码。
这种学习曲线增加了摩擦,并在第一次使用 API 时降低了开发人员的生产力。
另一方面,构建 API 的后端开发人员需要管理它并维护其文档。
当应用复杂性增加时,API 也会随之增加:更多需求导致创建更多端点。
端点的增加很可能会引入两个问题:过度获取和获取不足数据。
过度获取和获取不足
过度获取是指您获取的数据超出所需数据。这会导致性能降低,因为您消耗了更多带宽。
另一方面,有时您会发现端点没有返回 UI 中显示的所有必要信息,因此您最终向另一个端点发出一个或多个请求。这也会导致性能降低,因为将需要发生一系列网络请求。
在“awesome-links”应用中,如果您想要一个页面显示所有用户及其链接,您将需要向 /users/
端点发出 API 调用,然后向 /favorites
发出另一个请求以获取他们的收藏夹。
让 /users
端点返回用户及其收藏夹不会解决问题。这是因为您最终会得到一个巨大的 API 响应,这将花费很长时间才能加载。
REST API 不是类型化的
关于 REST API 的另一个缺点是它们不是类型化的。您不知道端点返回的数据类型,也不知道要发送的数据类型。这导致对 API 进行假设,这可能会导致错误或不可预测的行为。
例如,在发出请求时,您是将用户 ID 作为字符串还是数字传递?哪些请求参数是可选的,哪些是必需的?这就是为什么您将使用文档,但是,随着 API 的发展,文档可能会过时。有一些解决方案可以解决这些挑战,但我们不会在本课程中介绍它们。
GraphQL,REST 的替代方案
GraphQL 是一种新的 API 标准,由 Facebook 开发并开源。它为 REST 提供了更高效、更灵活的替代方案,客户端可以接收完全所需的数据。
您只需向单个端点发送请求,而不是向一个或多个端点发送请求并拼接响应。
这是一个 GraphQL 查询示例,该查询返回“awesome-links”应用中的所有链接。您将在构建 API 时稍后定义此查询
API 仅返回 id
和 title
,即使链接具有更多字段。
注意:这是 GraphiQL,一个用于运行 GraphQL 操作的 Playground。它提供了我们将在稍后更详细介绍的不错的功能
现在您将看到如何开始构建 GraphQL API。
定义模式
一切都从 GraphQL 模式开始,您可以在其中定义 API 可以执行的所有操作。您还可以指定操作的输入参数以及响应类型。
此模式充当客户端和服务器之间的合同。它还可以作为开发人员使用 GraphQL API 的文档。您可以使用 GraphQL 的 SDL(模式定义语言)定义模式。
让我们看看如何为“awesome-links”应用定义 GraphQL 模式。
定义对象类型和字段
您需要做的第一件事是定义对象类型。对象类型表示您可以从 API 获取的对象类型。
每个对象类型可以有一个或多个字段。由于您希望在应用中拥有用户,因此您需要定义 User
对象类型
User
类型具有以下字段
id
,类型为ID
。email
,类型为String
。image
,类型为String
。role
,类型为Role
。这是一个枚举,这意味着用户的角色可以采用两个值之一:USER
或ADMIN
。bookmarks
,类型为Link
的数组。表示用户可以拥有多个链接。您将在接下来定义Link
对象。
这是 Link
对象类型的定义
这是 Link
和 User
对象类型之间的多对多关系,因为 Link
可以拥有多个用户,而 User
可以拥有多个链接。这在数据库中使用 Prisma 建模。
定义查询
要从 GrahQL API 获取数据,您需要定义 Query
对象类型。这是一种类型,您可以在其中定义每个 GraphQL 查询的入口点。对于每个入口点,您定义其参数及其返回类型。
这是一个返回所有链接的查询。
links
查询返回 Link
类型的数组。!
用于指示此字段不可为空,这意味着当查询此字段时,API 将始终返回一个值。
您可以根据要构建的 API 类型添加更多查询。对于“awesome-links”应用,您可以添加一个查询来返回单个链接,另一个查询返回单个用户,再一个查询返回所有用户。
link
查询采用ID
类型的参数id
并返回Link
。id
参数是必需的,并且响应不可为空。user
查询采用ID
类型的参数id
并返回User
。id
参数是必需的,并且响应不可为空。users
查询返回User
类型的数组。id
参数是必需的。响应不可为空。
定义 mutation
要创建、更新或删除数据,您需要定义 Mutation
对象类型。按照约定,任何导致写入的操作都应通过 mutation 显式发送。同样,您不应使用 GET
请求来修改数据。
对于“awesome-links”应用,您将需要不同的 mutation 来创建、更新和删除链接
createLink
mutation 接受category
、description
、title
、url
和imageUrl
作为参数。所有这些字段都是String
类型并且是必需的。此 mutation 返回Link
对象类型。deleteLink
mutation 采用ID
类型的id
作为必需的参数。它返回必需的Link
。updateLink
mutation 采用与createLink
mutation 相同的参数。但是,参数是可选的。这样,当更新Link
时,您将仅传递要更新的字段。此 mutation 返回必需的Link
。
定义查询和 mutation 的实现
到目前为止,您仅定义了 GraphQL API 的模式,但您尚未指定当查询或 mutation 运行时应该发生什么。负责执行查询或 mutation 实现的函数称为解析器。在解析器内部,您可以向数据库发送查询或向第三方 API 发送请求。
对于本教程,您将在解析器内部使用 Prisma 向 PostgreSQL 数据库发送查询。
构建 GraphQL API
要构建 GraphQL API,您将需要一个 GraphQL 服务器,该服务器将提供单个端点。
此服务器将包含 GraphQL 模式以及解析器。对于此项目,您将使用 GraphQL Yoga。
要开始使用,请在您一开始克隆的启动器仓库中,在您的终端中运行以下命令
graphql
包是 GraphQL 的 JavaScript 参考实现。它是 graphql-yoga
的对等依赖项。
定义应用的模式
接下来,您需要定义 GraphQL 模式。在项目的根文件夹中创建一个新的 graphql
目录,并在其中创建一个新的 schema.ts
文件。您将定义 Link
对象以及返回所有链接的查询。
定义解析器
您需要做的下一件事是为 links
查询创建解析器函数。为此,创建一个 /graphql/resolvers.ts
文件并添加以下代码
resolvers
是一个对象,您将在其中定义每个查询和 mutation 的实现。Query
对象内的函数必须与模式中定义的查询名称匹配。Mutation 也是如此。这里的 links
解析器函数返回对象数组,其中每个对象的类型为 Link
。
创建 GraphQL 端点
要创建 GraphQL 端点,您将利用 Next.js 的 API 路由。/pages/api
文件夹中的任何文件都映射到 /api/*
端点并被视为 API 端点。
继续并创建一个 /pages/api/graphql.ts
文件并添加以下代码
您创建了一个新的 GraphQL Yoga 服务器实例,它是默认导出。您还使用 createSchema
函数创建了一个模式,该函数将类型定义和解析器作为参数。
然后,您使用 graphqlEndpoint
属性将 GraphQL API 的路径指定为 /api/graphql
。
最后,每个 API 路由都可以导出一个 config
对象以更改默认配置。此处禁用了正文解析。
使用 GraphiQL 发送查询
完成前面的步骤后,通过运行以下命令启动服务器
当您导航到 https://127.0.0.1:3000/api/graphql/
时,您应该看到以下页面
GraphQL Yoga 提供了一个名为 GraphiQL 的交互式 Playground,您可以使用它来探索 GraphQL 模式并与您的 API 交互。
使用以下查询更新右侧选项卡上的内容,然后按 CMD/CTRL + Enter 执行查询
响应应在左侧面板上可见,类似于上面的屏幕截图。
文档浏览器(页面左上角的按钮)将允许您单独探索每个查询/mutation,查看不同的所需参数及其类型。
初始化 Prisma 客户端
到目前为止,GraphQL API 在解析器函数中返回硬编码数据。您将在这些函数中使用 Prisma 客户端向数据库发送查询。
Prisma 客户端是一个自动生成的类型安全查询构建器。为了能够在您的项目中使用它,您应该实例化一次并在整个项目中重用它。继续在项目的根文件夹中创建一个 /lib
文件夹,并在其中创建一个 prisma.ts
文件。接下来,将以下代码添加到其中
首先,您正在创建一个新的 Prisma 客户端实例。然后,如果您不在生产环境中,Prisma 将附加到全局对象,以便您不会耗尽数据库连接限制。有关更多详细信息,请查看 Next.js 和 Prisma 客户端最佳实践的文档。
使用 Prisma 查询数据库
现在您可以更新解析器以从数据库返回数据。在 /graphql/resolvers.ts
文件中,将 links
函数更新为以下代码
如果一切设置正确,当您转到 https://127.0.0.1:3000/api/graphql
上的 GraphiQL 并重新运行链接查询时,数据应从您的数据库中检索。
当前 GraphQL 设置的缺陷
当 GraphQL API 的复杂性增加时,当前手动创建模式和解析器的工作流程可能会降低开发人员的生产力
- 解析器必须与模式和反之亦然具有相同的结构。否则,您可能会遇到错误和不可预测的行为。当模式演变或解析器实现更改时,这两个组件可能会意外地不同步。
- GraphQL 模式定义为字符串,因此 SDL 代码没有自动完成和构建时错误检查。
为了解决这些问题,可以使用 GraphQL 代码生成器等工具的组合。或者,您可以在构建模式及其解析器时使用代码优先方法。
使用 Pothos 的代码优先 GraphQL API
Pothos 是一个 GraphQL schema 构建库,您可以使用代码定义 GraphQL schema。这种方法的价值在于您可以使用编程语言来构建 API,这有多种好处。
- 无需在 SDL 和用于构建业务逻辑的编程语言之间进行上下文切换。
- 来自文本编辑器的自动完成。
- 类型安全(如果您正在使用 TypeScript)。
这些好处有助于提供更好的开发体验,减少摩擦。
在本教程中,您将使用 Pothos。它还为 Prisma 提供了一个出色的 插件,该插件在您的 GraphQL 类型和 Prisma schema 之间提供了良好的开发体验和类型安全性。
注意:即使不使用插件,Pothos 也可以在类型安全的方式下与 Prisma 一起使用,但是该过程非常手动。详情请见 此处。
首先,运行以下命令来安装 Pothos 和 Pothos 的 Prisma 插件。
接下来,将 pothos
generator 块添加到您的 Prisma schema 中,紧挨着 client
generator 的下方。
运行以下命令以重新生成 Prisma Client 和 Pothos 类型。
接下来,创建一个 Pothos schema builder 的实例作为可共享模块。在 graphql
文件夹中,创建一个名为 builder.ts
的新文件,并添加以下代码片段。
- 定义所有需要的库和实用程序。
- 创建一个新的
SchemaBuilder
实例。 - 定义将在创建 GraphQL schema 中使用的静态类型。
- 定义
SchemaBuilder
的选项,例如插件和将要使用的 Prisma Client 实例。 - 创建一个
queryType
,其中包含一个名为ok
的查询,该查询返回一个布尔值。
接下来,在 /graphql/schema.ts
文件中,将 typeDefs
替换为以下代码,这将从 Pothos 的 builder 创建一个 GraphQL schema。
最后,更新 /pages/api/graphql.ts
文件中的导入。
确保服务器正在运行,并导航到 https://127.0.0.1:3000/api/graphql
。您将能够发送一个带有 ok
字段的查询,它将返回 true
。
使用 Pothos 定义 schema
第一步是使用 Pothos 定义一个 Link
对象类型。继续创建一个 /graphql/types/Link.ts
文件,并添加以下代码。
由于您正在使用 Pothos 的 Prisma 插件,因此 builder
实例提供了用于定义 GraphQL schema 的实用方法,例如 prismaObject
。
prismaObject
接受两个参数。
name
:您想要公开的 Prisma schema 中模型的名称。options
:用于定义您要公开的类型的选项,例如描述、字段等。
注意:您可以使用 CTRL + Space 来调用编辑器的智能提示并查看可用的参数。
fields
属性用于定义您希望使用 "expose" 函数从 Prisma schema 中公开的字段。在本教程中,我们将公开 id
、title
、url
、imageUrl
和 category
字段。
t.relation
方法用于定义您希望从 Prisma schema 中公开的关系字段。
现在创建一个新的 /graphql/types/User.ts
文件,并添加以下代码以创建 User
类型。
由于 Prisma schema 中的 email
和 image
字段是可为空的,因此将 nullable: true
作为第二个参数传递给 expose 方法。
从生成的 schema 中“公开”role
字段类型时的默认类型。在上面的示例中,您定义了一个名为 Role
的显式枚举类型,然后用于解析 role
的字段类型。
要使 schema 中定义的对象类型在 GraphQL schema 中可用,请将导入添加到您刚刚在 graphql/schema.ts
文件中创建的类型中。
使用 Pothos 定义查询
在 graphql/types/Link.ts
文件中,在 Link
对象类型定义的下方添加以下代码。
在上面的代码片段中
- 定义一个名为
links
的查询类型。 - 定义将解析为生成的 Prisma Client 类型的字段。
- 指定 Pothos 将用于解析字段的字段。在本例中,它解析为
Link
类型的数组。 - 定义查询的逻辑。
解析器函数中的 query
参数将 select
或 include
添加到您的查询中,以便在单个请求中解析尽可能多的关系字段。
现在,如果您回到 GraphiQL,您将能够发送一个查询,该查询返回数据库中的所有链接。
客户端 GraphQL 查询
在本项目中,您将使用 Apollo Client。您可以发送常规 HTTP POST 请求与您刚刚构建的 GraphQL API 进行交互。但是,使用 GraphQL Client 可以获得很多好处。
Apollo Client 负责请求和缓存您的数据,以及更新您的 UI。它还包括用于查询批处理、查询去重和分页的功能。
在 Next.js 中设置 Apollo Client
要开始使用 Apollo Client,请运行以下命令将其添加到您的项目中。
接下来,在 /lib
目录中创建一个名为 apollo.ts
的新文件,并将以下代码添加到其中。
您正在创建一个新的 ApolloClient
实例,您将一个配置对象传递给它,其中包含 uri
和 cache
字段。
uri
字段指定您将与之交互的 GraphQL 端点。当应用程序部署时,这将更改为生产 URL。cache
字段是 InMemoryCache 的一个实例,Apollo Client 使用它在获取查询结果后缓存它们。
接下来,转到 /pages/_app.tsx
文件,并将以下代码添加到其中,这将设置 Apollo Client。
您正在使用 Apollo Provider 包装全局 App
组件,以便项目的所有组件都可以发送 GraphQL 查询。
注意:Next.js 支持不同的数据获取策略。您可以在服务器端、客户端或构建时获取数据。为了支持分页,您需要在客户端获取数据。
使用 useQuery
发送请求
要使用 Apollo client 在前端加载数据,请更新 /pages/index.tsx
文件以使用以下代码。
您正在使用 useQuery
hook 向 GraphQL 端点发送查询。此 hook 具有 GraphQL 查询字符串的必需参数。当组件渲染时,useQuery
返回一个对象,其中包含三个值。
loading
:一个布尔值,用于确定数据是否已返回。error
:一个对象,其中包含在发送查询后发生错误时的错误消息。data
:包含从 API 端点返回的数据。
保存文件并导航到 https://127.0.0.1:3000
后,您将看到从数据库中获取的链接列表。
分页
AllLinksQuery
返回您在数据库中的所有链接。随着应用程序的增长和您添加更多链接,您将获得一个大型 API 响应,这将需要很长时间才能加载。此外,解析器发送的数据库查询将变得更慢,因为您正在使用 prisma.link.findMany()
函数返回数据库中的链接。
提高性能的常用方法是添加对分页的支持。这是指将大型数据集拆分为更小的块,可以根据需要请求这些块。
有多种实现分页的方法。您可以执行编号分页,例如像 Google 搜索结果一样,或者您可以执行无限滚动,例如 Twitter 的 feed。
数据库级别的分页
现在在数据库级别,您可以使用两种分页技术:基于偏移的分页和基于游标的分页。
- 基于偏移:您跳过一定数量的结果并选择有限的范围。例如,您可以跳过前 200 个结果,然后仅获取 10 个。这种方法的缺点是它在数据库级别上无法扩展。例如,如果您跳过前 200,000 条记录,数据库仍然必须遍历所有这些记录,这将影响性能。
有关为什么您可能想要使用基于偏移的分页的更多信息,请查看文档。
- 基于游标的分页:您使用游标来标记结果集中的位置。在后续请求中,您可以直接跳转到该保存的位置。类似于您如何通过索引访问数组。
游标必须是唯一的、顺序的列 - 例如 ID 或时间戳。这种方法比基于偏移的分页更有效,并且将是您在本教程中使用的分页方式。
GraphQL 中的分页
为了使 GraphQL API 支持分页,您需要在 GraphQL schema 中引入 Relay Cursor Connections Specification。这是关于 GraphQL 服务器应如何公开分页数据的规范。
以下是 allLinksQuery
的分页查询的样子。
该查询接受两个参数,first
和 after
。
first
:一个Int
,用于指定您希望 API 返回多少项。after
:一个ID
参数,用于标记结果集中最后一项的位置,这就是游标。
此查询返回一个包含两个字段的对象,pageInfo
和 edges
。
pageInfo
:一个对象,帮助客户端确定是否还有更多数据要获取。此对象包含两个字段,endCursor
和hasNextPage
。endCursor
:结果集中最后一项的游标。此游标的类型为String
。hasNextPage
:API 返回的布尔值,让客户端知道是否还有更多页面可以获取。
edges
是一个对象数组,其中每个对象都有cursor
和node
字段。此处的node
字段返回Link
对象类型。
您将实现单向分页,其中在页面首次加载时请求一些链接,然后用户可以通过单击按钮获取更多链接。
或者,您可以在用户滚动到页面末尾时发出此请求。
其工作方式是,您在页面首次加载时获取一些数据。然后在单击按钮后,您向 API 发送第二个请求,其中包含您希望返回多少项以及一个游标。然后返回数据并在客户端上显示。
注意:双向分页的一个示例是像 Slack 这样的聊天应用程序,您可以通过向前或向后滚动来加载消息。
修改 GraphQL schema
Pothos 提供了一个插件,用于处理带有节点、连接和其他实用程序的 relay 样式游标分页。
使用以下命令安装插件。
更新 graphql/builder.ts
以包含 relay 插件。
更新解析器以从数据库返回分页数据
要使用基于游标的分页,请对 links
查询进行以下更新。
prismaConnection
方法用于创建一个 connection
字段,该字段还会预加载该连接内的数据。
这是一个总结分页如何在服务器上工作的图表。
在客户端上使用 fetchMore()
进行分页
既然 API 支持分页,您可以使用 Apollo Client 在客户端上获取分页数据。
useQuery
hook 返回一个包含 data
、loading
和 errors
的对象。但是,useQuery
还返回一个 fetchMore()
函数,该函数用于处理分页并在返回结果时更新 UI。导航到 /pages/index.tsx
文件并更新它以使用以下代码来添加对分页的支持。
您首先将一个 variables
对象传递给 useQuery
hook,其中包含一个名为 first
的键,其值为 2
。这意味着您将获取两个链接。您可以将此值设置为您想要的任何数字。
data
变量将包含从 API 的初始请求返回的数据。
然后,您从 pageInfo
对象中解构 endCursor
和 hasNextPage
值。
如果 hasNextPage
为 true
,我们将显示一个带有 onClick
处理程序的按钮。此处理程序返回一个调用 fetchMore()
函数的函数,该函数接收具有以下字段的对象。
- 一个
variables
对象,它接受从初始数据返回的endCursor
。 updateQuery
函数,它负责通过将先前的结果与第二次查询返回的结果组合来更新 UI。
如果 hasNextPage
为 false
,则表示没有更多链接可以获取。
如果您保存并且您的应用程序正在运行,您应该能够从数据库中获取分页数据。
总结和后续步骤
恭喜!您已成功完成本课程的第二部分!如果您遇到任何问题或有任何疑问,请随时在 我们的 Slack 社区中联系我们。
在本部分中,您学习了关于
- 使用 GraphQL 而不是 REST 的优势
- 如何使用 SDL 构建 GraphQL API
- 如何使用 Pothos 构建 GraphQL API 及其提供的优势
- 如何在 API 中添加对分页的支持以及如何从客户端发送分页查询
在本课程的下一部分中,您将
- 使用 Auth0 添加身份验证以保护 API 端点,这样,只有登录用户才能查看链接
- 创建一个 mutation,以便登录用户可以收藏链接
- 创建一个仅供管理员使用的路由来创建链接
- 设置 AWS S3 以处理文件上传
- 添加一个 mutation 以管理员身份创建链接
不要错过下一篇文章!
注册 Prisma 新闻通讯