【问题标题】:Call GraphQL endpoint from within same Express app without making a HTTP call从同一个 Express 应用程序中调用 GraphQL 端点而不进行 HTTP 调用
【发布时间】:2020-07-14 11:29:43
【问题描述】:

我有一个标准的 Express 应用,我正在使用 apollo-server-express 向它添加一个 GraphQL 端点:

  const server = new ApolloServer({
    schema: executableSchema
  });

  server.applyMiddleware({ app: expressApp });

然后我让我的 Express 应用程序的其余部分定义标准 REST 端点。我想让两个接口都保持正常运行(REST + GraphQL),但减少例如 POST 端点处理程序和 Mutation Resolver 之间的逻辑重复,因为这两者的逻辑内容非常相似.

有没有办法在 Express 中接收请求,重新格式化它,然后以某种方式......在同一服务器上的 GraphQL 端点上转发它,在同一个 Express 应用程序中,而不进行不必要的 HTTP 调用?

【问题讨论】:

    标签: node.js express graphql


    【解决方案1】:

    这在技术上是可行的,因为您可以直接针对模式执行请求(请参阅here)。但是,您必须手动将您的控制器映射到特定的查询,这不必要地复杂。更好的选择是将通用逻辑提取到单独的模块中,然后供 GraphQL 解析器和 REST 控制器使用。无论如何,以这种方式将业务逻辑与控制器/解析器分开是最佳实践——正是因为这样的场景。

    // post-service.js
    module.exports = {
      create: (content, author) => {
        // this just calls another function, but in reality you might include any number
        // of additional steps, for example, transforming and validating the inputs
        return Post.create({ content, author })
      }
    }
    
    // post-controller.js
    module.exports = async (req, res, next) => {
      const post = await PostService.create(req.body.content, req.user)
      return post
    }
    
    // resolvers.js
    module.exports = {
      Mutation: {
        createPost: (root, args, ctx) => {
          const post = await PostService.create(args.content, ctx.user)
          return post
        },
      },
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-22
      • 2021-05-13
      • 2023-03-05
      • 2018-10-01
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 2019-08-03
      相关资源
      最近更新 更多