在浏览器刷新时在Nuxt asyncData中使用axios丢失令牌

uoifb46i  于 2022-11-05  发布在  iOS
关注(0)|答案(1)|浏览(158)

我在Nuxt的Axios中使用asyncData从一个API获得 meta标记,但我的问题是元描述必须设置为服务器端才能出现在代码中。
所以我添加了以下我的nuxt页:

asyncData(context) {
  return context.$axios
    .get('/api/house', {
      headers: {
        'X-AUTH-TOKEN': '######',
        'Content-Type': 'application/json',
      },
    })
    .then((res) => {
      return { fetchedData: res.data.page.meta }
    })
},

起初, meta描述在代码中,但如果我刷新浏览器,我会丢失我的令牌。
我尝试将其添加到nuxt.config.js中,并使用以下代码:

axios: {
  headers: {
    common: {
      'X-AUTH-TOKEN': '###################',
      'Content-Type': 'application/json',
    },
  },
},

我想每个axios GET请求都会有令牌服务器端而不会丢失,但这不起作用,所以我试着设置一个axios拦截器,生成一个axios.js并将其添加到nuxt.config.js中:

plugins: [
  { src: '~/plugins/axios.js' },  
]

我的axios.js

import axios from 'axios'

const AUTH_TOKEN = '#######################'

axios.defaults.headers.common['Authorization'] = AUTH_TOKEN

axios.defaults.headers.post['Content-Type'] = 'application/json'

但是每次刷新Nuxt页面时,结果仍然是一样的,令牌消失了,因为我使用了asyncData,页面没有呈现。
如何使用asyncData设置我的 meta描述,并将我的令牌添加到每个GET请求,即使我刷新了浏览器?

*编辑

下面是我如何使我的客户端请求在我的nuxt页面的 meta标记:

<script>
export default {
  layout: 'house',

  asyncData(context) {
    return context.$axios
      .get('/api/house', {
        headers: {
          'X-AUTH-TOKEN': '### TOKEN HARDCODED ###',
          'Content-Type': 'application/json',
        },
      })
      .then((res) => {
        return { fetchedData: res.data.page.meta }
      })
  },

  data() {
    return {
      route: 'house',
      fetchedData: [],
    }
  },
  head() {
    return {
      title: this.fetchedData.title,
      meta: [
        { charset: 'utf-8' },
        { name: 'viewport', content: 'width=device-width, initial-scale=1' },
        { hid: 'description', name: 'description', content: this.fetchedData.description },
      ],
    }
  },
}
</script>
lvmkulzt

lvmkulzt1#

好了,下面是一个代码框,它向您展示了一个测试伪API的工作示例:https://codesandbox.io/s/so-async-data-nuxt-axios-get-f4y3v?file=/pages/index.vue
这是真正有趣的代码

<template>
  <div>
    <p>fetched data below</p>
    <p>{{ fetchedData }}</p>
  </div>
</template>

<script>
export default {
  async asyncData({ $axios, $config: { secureToken } }) { // import your env varibles here
    const response = await $axios.$get( // $get shortcut, https://axios.nuxtjs.org/usage#-shortcuts
      'https://jsonplaceholder.typicode.com/todos/1',
      {
        headers: {
          'X-AUTH-TOKEN': secureToken,
          'Content-Type': 'application/json',
        },
      }
    )
    return { fetchedData: response }
  },
}
</script>

当然,您可以对secureToken进行硬编码,但在这里,我向您展示了如何使用env变量。
这是nuxt.config.js文件的一部分

export default {
  publicRuntimeConfig: {
    secureToken: process.env.SECURE_TOKEN,
  },
  ...
}

你应该把一个.env文件。

SECURE_TOKEN="### TOKEN HARDCODED ###"

当然,它需要被列入.gitignore的黑名单(默认行为)。我提交它是为了示例目的,不要公开它。在您的服务器上使用env变量!:)
一旦这是工作,你可以看看一些axios全局配置。让我知道如果这一个工作正常,然后再继续。

相关问题