美文网首页
nuxt GraphQl关于请求(返回)头信息那些事

nuxt GraphQl关于请求(返回)头信息那些事

作者: 想做个文人 | 来源:发表于2020-05-13 18:29 被阅读0次

    最近换了一个环境,重新起航,接触到的项目是用nuxt开发,接口调用有用到graphql,这个东西以前也没接触过,耗了比较久的时间来研究这个东西,后来老大说,我们后端以后都不用graphql了,so...wtf

    nuxt配置

    1,先装nuxt/apollo

    npm install @nuxtjs/apollo --save
    

    2,nuxt.config.js

    {
      modules: [
         '@nuxtjs/apollo' 
      ],
      apollo: {
        clientConfigs: {
          default: {
            // required
            httpEndpoint: 'http://localhost:4000/graphql'
          },
          // 配置第二个端点
            web: '~/plugins/apollo-config-custom.js'
          }
      }
    }
    

    3,在plugins目录新建apollo-config-custom.js 名字随意

    1. 添加请求头
    const config = require('~/config')
    
    // process.env.BASE在运行命令传进来的,pagage.json里面进行配置即可,dev/test/prev/prod
    const base = process.env.BASE || 'dev'
    
    export default function(context) {
      const { query } = context
      let token = ''
      // 客户端渲染
      if (process.client) {
        if (query.token) {
          token = query.token
        } 
      } 
      // https://stackoverflow.com/questions/57596674/how-to-catch-and-modify-apollo-response-globally
      // https://github.com/nuxt-community/apollo-module/issues/127
      return {
        httpEndpoint: config.api[base].web,
        browserHttpEndpoint: '/api',
        link: constructorMiddleware,
        inMemoryCacheOptions: {
          addTypename: false
        },
        httpLinkOptions: {
          headers: { // 添加请求头
            token // 请求头 token字段
          }
        },
        getAuth: () => `Bearer ${token}`
      }
    }
    
    1. 获取response
      实际运用apollo请求接口后发现,需要的服务器时间戳后端放在了data同级,而Apollo是对返回值进行了封装,并且返回值不允许修改;通过查看nuxt-apollo , apollo文档貌似都没看到有对response的获取的方法,可能是自己英文不太好吧,最后google到了一个获取返回值的方法:
    // apollo-config-custom.js
    import { ApolloLink } from 'apollo-link'
    const constructorMiddleware = new ApolloLink((operation, forward) => {
        return forward(operation).map(response => {
          const newResponse = {
            data: Object.assign(response.data, { serverTimestamp: response.serverTimestamp })
          }
          // 想到一个方法,把response.serverTimestamp 绑定到nuxt全局变量context中,这样就能在需要的地方获取到了
          context = Object.assign(context, { serverTimestamp: response.serverTimestamp })
          return newResponse // 发现response无法修改
        })
      })
    
    ...
    return {
      ...
      link: constructorMiddleware,
      ...
    }
    

    总结

    通过对Apollo的研究,对Apollo有了进一步的了解,对通过文档没找到解决需求的方法时,更多的养成了去阅读源码的习惯去找解决办法的习惯,在找如果添加请求的头的时候,由于忽略了文档中提到的httpLinkOptions的提示注释,在网上查了很久,最后再源码中通过查找header发现就是用到了htppLinkOptions参数。如果你也在使用Apollo或者nuxt项目中有用到Apollo,需要添加自定义请求头字段的话,或许对你有帮助~

    相关文章

      网友评论

          本文标题:nuxt GraphQl关于请求(返回)头信息那些事

          本文链接:https://www.haomeiwen.com/subject/zpronhtx.html