使用 REST 包装 GraphQL 从 NestJS 提供 GraphQL 和 REST API
Posted
技术标签:
【中文标题】使用 REST 包装 GraphQL 从 NestJS 提供 GraphQL 和 REST API【英文标题】:Serve both GraphQL and REST API from NestJS with REST wrapping GraphQL 【发布时间】:2021-11-23 13:32:55 【问题描述】:于 10 月 2 日更新,提供更多说明和示例
我正在构建一个NestJS API(不是用于 React 服务器端渲染的 Next.js)。为了帮助采用,我正在考虑同时提供 GraphQL 和传统的 REST 端点,但首先要努力的是 GraphQL。理想情况下,我会先开发 GraphQL,REST 本质上只是在内部进行 GraphQL 查询调用,没有任何重定向。
例如,假设有一个端点列出了当年提供的所有课程,等效的 GraphQL 端点将是这样的
classes( year: 2021 )
courseId,
name,
teacher
firstName,
lastName,
,
credit,
prerequisite
courseId,
name,
我们的 API 还将公开 REST 端点 /api/classes?year=2021
,而不是复制 GraphQL 解析在控制器中所做的相同逻辑,理想情况下,控制器只需将 GraphQL 查询放在一起并将其直接扔回 NestJS 实例所以所有的http头等都会被保留。
想知道如何才能做到这一点。
在
【问题讨论】:
【参考方案1】:NestJS 与您要实现的目标几乎没有关系,因为它最终用于 React 应用程序的服务器端渲染。您的请求仅涉及您可以(并且在我的拙见中可能应该)独立构建的 API 方面。
假设您的服务器将是基于 JS 的,它最终将使用 graphql.js,这是所有服务器使用的参考实现。
这允许您使用架构、解析器和查询调用 graphql()
函数以获取结果。
如果您使用像 Apollo 这样的服务器,它们通常会在其之上提供一个 API 来执行查询方向。对于 Apollo,我相信你可以使用 server.executeOperation
。
最终的想法是,如果您需要创建架构/服务器的单例,然后您可以将其导入您的休息路由的控制器并使用它来发出 GraphQL 请求。如果使用 express 可能看起来像:
const apollo = new ApolloServer(
schema,
);
export default apollo;
import server from './apollo';
const router = express.Router();
router.get('/some/path', async (req: Request, res: Response) =>
const result = await server.executeOperation(
query: ' some id ',
);
res.json(result);
);
【讨论】:
请注意,OP 询问了 NestJS 一个基于架构和依赖注入的 NodeJS 框架,而不是关于 NextJS 这是反应服务器端渲染框架 这是正确的@JayMcDoniel,我问的是 NestJS,而不是 React 的 NextJS。 我的不好读得太快了,那就忽略第一段。这个想法仍然存在,我将使用嵌套控制器更新示例。您是否也有自己选择的 graphql 服务器? 谢谢@Sytten,如果我成功了,我会试一试并报告。以上是关于使用 REST 包装 GraphQL 从 NestJS 提供 GraphQL 和 REST API的主要内容,如果未能解决你的问题,请参考以下文章
使用 Apollo React 用 GraphQL 包装 REST api
Nest.JS 使用 AuthGuard 作为 GraphQL 的中间件
如何将 Express REST 层放在 Apollo GraphQL 服务器之上?