Nuxt Apollo websockets link 选项?

Nuxt Apollo websockets link options?

我正在尝试让 websocket 订阅与 Nuxt Apollo 一起使用。对于我的服务器 (8base.com),我需要随订阅请求一起发送一个 connectionParams 对象。

Nuxt Apollo 好像有httpLinkOptions,但我真正需要的是wssLinkOptions。有人知道用 Nuxt 做到这一点的方法吗?理想情况下,我不必替换 Nuxt Apollo,因为我在整个应用程序中都在使用它。

根据文档,您可以将订阅设置为 WebSocketLink。

https://www.npmjs.com/package/@nuxtjs/apollo/v/3.0.4#example-with-subscription-graphcool-as-example

  // Set up subscription
  const wsLink = new WebSocketLink({
    uri: `wss://subscriptions.graph.cool/v1/${process.env.GRAPHQL_ALIAS}`,
    options: {
      reconnect: true,
      connectionParams: () => {
        const token = process.server ? ctx.req.session : window.__NUXT__.state.session
        return {
          Authorization: token ? `Bearer ${token}` : null
        }
      }
    }
  })

这里是完整的例子:

Nuxt 配置:

// nuxt.config.js
apollo:{
 clientConfigs:{
  default: '~/apollo/client-configs/default.js'
 }
}

默认客户端配置:

// apollo/client-configs/default.js
import { ApolloLink, concat, split } from 'apollo-link'
import { HttpLink } from 'apollo-link-http'
import { InMemoryCache } from 'apollo-cache-inmemory'
import { WebSocketLink } from 'apollo-link-ws'
import { getMainDefinition } from 'apollo-utilities'
import 'subscriptions-transport-ws' // this is the default of apollo-link-ws

export default (ctx) => {
  const httpLink = new HttpLink({uri: 'https://api.graph.cool/simple/v1/' + process.env.GRAPHQL_ALIAS})
  const authMiddleware = new ApolloLink((operation, forward) => {
    const token = process.server ? ctx.req.session : window.__NUXT__.state.session
    operation.setContext({
      headers: {
        Authorization: token ? `Bearer ${token}` : null
      }
    })
    return forward(operation)
  })
  // Set up subscription
  const wsLink = new WebSocketLink({
    uri: `wss://subscriptions.graph.cool/v1/${process.env.GRAPHQL_ALIAS}`,
    options: {
      reconnect: true,
      connectionParams: () => {
        const token = process.server ? ctx.req.session : window.__NUXT__.state.session
        return {
          Authorization: token ? `Bearer ${token}` : null
        }
      }
    }
  })

  const link = split(
    ({query}) => {
      const {kind, operation} = getMainDefinition(query)
      return kind === 'OperationDefinition' && operation === 'subscription'
    },
    wsLink,
    httpLink
  )

  return {
    link: concat(authMiddleware, link),
    cache: new InMemoryCache()
  }
}

客户端配置订阅应该使用 Vue Apollo 模型工作:https://apollo.vuejs.org/guide/apollo/subscriptions.html#setup

如果您只需要基础知识,您也可以只指定 HTTP 和 WS 端点:

apollo:{
 clientConfigs:{
  default:{
    httpEndpoint: YOUR_ENDPOINT,
    wsEndpoint: YOUR_WS_ENDPOINT
  }
 }
}

所以在尝试了几种不同的方法之后,这似乎是最好的方法。只需使用插件覆盖 wsClient

因此 nuxt.config.js:

    plugins: [
        { src: "~/plugins/apollo-ws-client.js", mode: "client" }
    ],
    apollo: {
        clientConfigs: {
            default: "~/plugins/apollo-config-default.js"
        }
    },

plugins/apollo-config-default.js中:

export default function() {
    return {
        httpEndpoint: "https://api.8base.com/123456",
        wsEndpoint: "wss://ws.8base.com"
    }
}

然后在plugins/apollo-ws-client.js

export default ({ app }) => {
    const client = app.apolloProvider.defaultClient
    const token = app.$apolloHelpers.getToken()

    if (token) {
        client.wsClient.lazy = true
        client.wsClient.reconnect = true
        client.wsClient.connectionParams = () => {
            return {
                workspaceId: "123456",
                token: token
            }
        }
    }
}

效果很好。

这就是我在 nuxt.config 内部直接配置的方式

  modules: [
    '@nuxtjs/apollo',
  ],
  apollo: {
    clientConfigs: {
      default: {
          httpEndpoint: 'your_graphql_url'
      }
    }
  },
  env: {
      WS_URL: 'ws://you_url/ws',
  }