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',
}
我正在尝试让 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',
}