带有盖茨比安装程序的Apollo订阅

时间:2020-03-09 04:26:55

标签: graphql gatsby apollo

以下是我与Apollo一起对Gatsby SSR进行的设置,适合那些寻求解决方案的人。希望它能帮助那些在网上寻找如何使用Apollo设置盖茨比的解决方案的人

积分:[https://github.com/apollographql/subscriptions-transport-ws/issues/333]

目前我不确定我的onError变量是否正确放置。我会查起来

尽管如此,使用此设置的gatsby客户端路由订阅仍然可以正常工作

1 个答案:

答案 0 :(得分:1)

client.js //要导入到ApolloProvider中

import ApolloClient from 'apollo-client'
// import * as ws from 'ws'
// import { createHttpLink } from 'apollo-link-http'
import { split } from 'apollo-link'
// import { setContext } from 'apollo-link-context'
import { onError } from 'apollo-link-error'
import { HttpLink } from 'apollo-link-http'
import { WebSocketLink } from 'apollo-link-ws'
// import fetch from 'isomorphic-fetch' // Comment out this line results in an error ...
import 'isomorphic-fetch'
import { InMemoryCache } from 'apollo-cache-inmemory'
import { getMainDefinition } from 'apollo-utilities'

const HTTP_URI = `http://localhost:4000/graphql`
const WS_URI = `ws://localhost:4000/graphql`

const httplink = new HttpLink({
  uri: HTTP_URI,
  // credentials: 'same-origin',
  // fetch,
})

const wsLink = process.browser
  ? new WebSocketLink({
      // if you instantiate in the server, the error will be thrown
      uri: WS_URI,
      options: {
        reconnect: true,
      },
    })
  : null

const errorLink = onError(({ networkError, graphQLErrors }) => {
  if (graphQLErrors) {
    graphQLErrors.map(({ message, locations, path }) =>
      console.log(
        `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`
      )
    )
  }
  if (networkError) console.log(`[Network error]: ${networkError}`)
})

const link = process.browser
  ? split(
      //only create the split in the browser
      // split based on operation type
      ({ query }) => {
        const { kind, operation } = getMainDefinition(query)
        return kind === 'OperationDefinition' && operation === 'subscription'
      },
      wsLink,
      httplink,
      errorLink
    )
  : httplink

export const client = new ApolloClient({
  link,
  cache: new InMemoryCache(),
})

graphql / subscriptions.js

import gql from 'graphql-tag'

const BOOK_ADDED_SUBSCRIPTION = gql`
  subscription {
    bookAdded {
      _id
      title
      author
    }
  }
`
export { BOOK_ADDED_SUBSCRIPTION }