3

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

但是,如果稍后添加了 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
})

希望你能理解我想要做什么?

谢谢

4

1 回答 1

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()   } }])
于 2017-08-02T14:47:33.437 回答