使用 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

在 REST API 周围添加 graphql 包装器?

Nest.JS 使用 AuthGuard 作为 GraphQL 的中间件

如何将 Express REST 层放在 Apollo GraphQL 服务器之上?

Angular / Nest / GraphQL - 无法上传文件(400 错误请求或 500)

如何将firebase时间戳与graphql nest js一起使用?