如何设置 ApolloServer 和 SubscriptionServer 以在 graphql 中使用 http 和 ws

Posted

技术标签:

【中文标题】如何设置 ApolloServer 和 SubscriptionServer 以在 graphql 中使用 http 和 ws【英文标题】:How to setup ApolloServer and SubscriptionServer to use http and ws in graphql 【发布时间】:2020-09-17 09:56:42 【问题描述】:

我一直在关注here 和here 的文档来实现subscriptions-transport-ws 插件。我最大的困惑是区分http://ws:// 的graphql url。在上面的示例中,ApolloServer 似乎被 SubscriptionServer 取代。但是如果我只想在特殊情况下使用websockets,那我不是还需要两者吗?或者SubscriptionServer 是同时处理两者并在后台做一些魔术,根据是否调用订阅来确定使用哪一个?

【问题讨论】:

【参考方案1】:

apollo-server 结合了几个工具,例如:graphql-tools、graphql-subscriptions、graphql-upload,提供一些custom errors,并使用express.js web 框架作为其默认的 web 服务器实现。

subscriptions-transport-ws 是一个 GraphQL WebSocket 服务器和客户端,用于通过 WebSocket 促进 GraphQL 查询、突变和订阅。

subscriptions-transport-ws 是 GraphQL 的扩展,您可以将它与任何 GraphQL 客户端和服务器(不仅是 Apollo)一起使用。

所以,ApolloServer SubscriptionServer替换。

不使用ApolloServer,你需要自己设置使用express.jsgraphqlExpressgraphiqlExpresscors中间件的GraphQL HTTP服务器。就像official sample 一样。

如果要创建订阅服务器,则需要创建 HTTP 服务器并将其传递给 initing and connecting WebSocket server to http 的构造函数 initing and connecting WebSocket server to http

【讨论】:

请记住,subscriptions-transport-ws 没有得到积极维护:“subscriptions-transport-ws 库没有得到积极维护。建议您改用 graphql-ws 库。有关详细信息,请阅读 GraphQL over WebSockets 公告“

以上是关于如何设置 ApolloServer 和 SubscriptionServer 以在 graphql 中使用 http 和 ws的主要内容,如果未能解决你的问题,请参考以下文章

ApolloServer 2.0 上下文和 GraphQL API 的公共/私有部分

如何在 ApolloServer 中获取 req.user

如何在 ApolloServer 中添加响应头?

我们如何从 apollo-server 模块传递 ApolloServer 中的数据源和合并的 graphql 模式和解析器?

支持 ApolloServer 中的 Objection `$formatJson`

ApolloServer 模式选项