如何重新运行Vue.js ApolloClient中间件?

时间:2017-08-02 13:07:24

标签: javascript vue.js vuejs2 apollo vue-apollo

在我的main.js中,我有一些代码可以检查是否存在localStorage项目。如果有,它将通过中间件向ApolloClient设置添加Authorization标题。

但是,如果以后添加了的localStorage项,则main.js的中间件中不会出现该项。因此,需要整页刷新以使其获取/了解其存在。

如何从一个方法中再次运行main.js(如果这甚至是解决方案),例如,一个用户签名的组件?

这是我的main.js

import Vue from 'vue'
import ApolloClient, { createNetworkInterface } from 'apollo-client'
import VueApollo from 'vue-apollo'
import App from './App'
import router from './router'
import store from './store'

const networkInterface = createNetworkInterface({ uri: 'https://api.graph.cool/simple/v1/MY-ID-HERE' })
const requestToken = localStorage.getItem('TOKEN')

networkInterface.use([{
  applyMiddleware (req, next) {
    if (!req.options.headers) {
      req.options.headers = {}
    }
    req.options.headers['Authorization'] = requestToken ? `Bearer ${requestToken}` : null
    next()
  }
}])

const apolloClient = new ApolloClient({
  networkInterface
})

const apolloProvider = new VueApollo({
  defaultClient: apolloClient
})

Vue.use(VueApollo)

/* eslint-disable no-new */
new Vue({
  el: '#app',
  template: '<App />',
  components: {
    App
  },
  apolloProvider,
  router,
  store
})

希望你能理解我想要做的事情吗?

由于

1 个答案:

答案 0 :(得分:2)

我相信您需要在requestToken函数中移动applyMiddleware声明。这样,每次发出请求时,您都会检查本地存储是否有令牌。否则,它只会检查一次,当页面加载并且您最终看到您描述的行为时。

networkInterface.use([{   applyMiddleware (req, next) {
    const requestToken = localStorage.getItem('TOKEN')
    if (!req.options.headers) {
      req.options.headers = {}
    }
    req.options.headers['Authorization'] = requestToken ? `Bearer ${requestToken}` : null
    next()   } }])