为什么Apollo Server不是Express的中间件,而不是一个接受Express作为中间件的服务器?

Eva*_*oll 6 middleware express apollo graphql

我只是想知道这个看似笨拙的配置是什么原因(来自Apollo Server的入门),

const server = new ApolloServer({
  // These will be defined for both new or existing servers
  typeDefs,
  resolvers,
});

server.applyMiddleware({ app }); // app is from an existing express app
Run Code Online (Sandbox Code Playgroud)

为什么我正在打电话.applyMiddleware()给我app而不是使用app.use()它,甚至似乎从文档来看,Apollo只是回答请求/graphql而不是更好地遵循Express API,

let apollo = require('apollo-server').ApolloMiddleware
app.use( '/graphql', apollo({ typeDefs, resolvers }) );
Run Code Online (Sandbox Code Playgroud)

似乎Apollo正在颠覆Express的正常中间件流程?采用阿波罗方式的优势是什么?

Dan*_*ews 2

我不与这些人合作,但根据那里的代码,我认为这与它向应用程序添加了正文解析器、上传功能、Websockets(如果您选择使用此功能)这一事实有关,以及用于引擎健康检查的众所周知的配置。根据该规范,众所周知的必须是根源。此外,如果您使用订阅和 websocket,它们会监听httpServer.once('listening'),因此它们必须有权访问您的应用程序。如果他们只是给你一个可以安装的,你就不会app.listen安装它,因为你只能app.listen自己安装。

仅从内部来看,至少这是我所期望的。