【问题标题】:Difference on GraphQL endpoint between apollo-server and apollo-server-expressapollo-server 和 apollo-server-express 在 GraphQL 端点上的区别
【发布时间】:2022-02-10 19:28:19
【问题描述】:

由于我需要为我的 GraphQL 服务器添加更多配置,我正在从 apollo-server 切换到 apollo-server-express (as recommended by the documentation)。

这是我的老index.ts

import { env } from 'process'
import { ApolloServer } from 'apollo-server'
import { typeDefs } from '../graphql/schema'
import { context } from './context'
import resolvers from '../graphql/resolvers/'

const port = env.GRAPHQL_SERVER_PORT || 80

const server = new ApolloServer({
  typeDefs,
  resolvers,
  context
})

server.listen({ port: port }).then(({ url }) => {
  console.log(`Server ready at ${url}`)
})

这就是我现在要做的:

import { env } from 'process'
import { ApolloServer } from 'apollo-server-express';
import { ApolloServerPluginDrainHttpServer } from 'apollo-server-core';
import express from 'express';
import { forceDomain } from 'forcedomain'
import http from 'http';
import { typeDefs } from '../graphql/schema'
import { context } from './context'
import resolvers from '../graphql/resolvers/'

async function startApolloServer(typeDefs: any, resolvers: any, context: any) {
  const port = env.GRAPHQL_SERVER_PORT || 80
  const app = express();
  const httpServer = http.createServer(app);
  const plugins = [ApolloServerPluginDrainHttpServer({ httpServer })]

  const server = new ApolloServer({
    typeDefs,
    resolvers,
    context,
    plugins,
  });

  await server.start();

  app.use(function(req, res, next) {
    // some extra middleware configuration here
  })

  server.applyMiddleware({ app })

  await new Promise<void>(resolve => httpServer.listen({ port: port }, resolve))
  console.log(`Server ready at http://localhost:${port}${server.graphqlPath}`)
}

startApolloServer(typeDefs, resolvers, context)

我不明白的是,在切换到 apollo-server-express 后,一切正常(并且添加的中间件完成了我需要它做的事情)但是 GraphQL 端点被移动到 /graphql 路由(即 @当我使用apollo-serverlisten 方法时,而不是像以前那样位于根目录上(所以只是http://localhost:4000)。

为什么会这样,我如何在使用apollo-server-express 的同时将端点保持在服务器的根目录上?

【问题讨论】:

    标签: node.js express graphql apollo-server


    【解决方案1】:

    我不确定为什么中间件现在可以在没有看到您如何实现它们的情况下工作,但“GraphQL 中间件”与“Express 中间件”完全不同,所以可能是它们的结构方式。

    关于路由,这只是在/graphql 创建基本 GraphQL 路由的标准,因为在 Express 应用程序中,您可能在根目录下有其他 REST 路由。

    要更改此行为,您可以将行 server.applyMiddleware({ app }) 更改为 server.applyMiddleware({ app, path: '/' }) 并使用您希望 GraphQL 启动的路径。

    【讨论】:

    • 正如我所说,中间件本身工作正常,不是问题所在。但是添加path: '/'确实是我需要的。
    猜你喜欢
    • 2020-02-23
    • 2019-09-01
    • 2021-04-20
    • 2021-02-05
    • 1970-01-01
    • 2022-11-09
    • 2018-10-21
    • 2019-09-14
    • 2019-04-30
    相关资源
    最近更新 更多