【问题标题】:Serve both GraphQL and REST API from NestJS with REST wrapping GraphQL使用 REST 包装 GraphQL 从 NestJS 提供 GraphQL 和 REST API
【发布时间】: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头等都会被保留。

想知道如何才能做到这一点。

【问题讨论】:

    标签: graphql nestjs


    【解决方案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,如果我成功了,我会试一试并报告。
    猜你喜欢
    • 2020-01-21
    • 2018-03-19
    • 2020-07-04
    • 2020-09-28
    • 2021-06-27
    • 2019-01-27
    • 2019-12-05
    • 2020-12-12
    • 2021-04-25
    相关资源
    最近更新 更多