在Nuxt JS中设置Cache-Control标头可在localhost上使用,但不能在生产环境中使用

问题描述 投票:0回答:1

[当我在Zeit上部署Nuxt JS通用应用程序时,我试图利用Cache-Control中提到的Zeit的Zeit Cache Doc标头。

然后我试图寻找如何在我的Nuxt JS应用程序中添加Cache-Control标头,并幸运地发现this GitHub issue在解释同一件事。

现在,无论如何我还是在Nuxt应用程序中使用serverMiddleware来使用firebase-admin获取当前登录用户的数据,所以我认为我可以轻松地在代码中添加响应标头,所以我做到了。在我的/serverMiddleware/handleCookie.js中,它是这样的:

const Cookies = require('cookies')
const admin = require('../services/firebase-admin-init')

export default async (req, res, next) => {
  res.setHeader('Cache-Control', 's-maxage=1000, stale-while-revalidate')

  try {
    const authUser = await verifyCookie(req, res)

    if (authUser) {
      const userData = await fetchUserDetailsFromFirestore(
        req,
        authUser.uid,
        authUser.email_verified
      )

      if (userData) {
        next()
      }
    } else {
      next()
    }
  } catch (error) {
    console.error(error)
  }
}

现在疯狂的事情是,当我运行开发人员即yarn nuxt并通过localhost检查我的网站时,我可以轻松地在Chrome网络工具中看到添加的标题。

header showing up in localhost

但是当我使用now --prod将项目推送到Zeit Now进行托管并检查我的实际站点时,看不到此标题。

no header in production

现在,我不知道我做错了什么,因为如果我做错了,它应该不会显示在localhost dev响应头中。我花了很多天试图解决这个问题,但无济于事。不知道为什么会这样。我还在Zeit部署中使用nuxt/now-builder,这是我的now.json文件。

{
  "version": 2,
  "regions": ["bom1"],
  "builds": [
    {
      "src": "nuxt.config.js",
      "use": "@nuxtjs/now-builder",
      "config": {
        "serverFiles": [
          "services/firebase-admin-init.js",
          "serverMiddleware/**"
        ]
      }
    }
  ]
}

[如果有人可以在这件事上提供帮助,那将非常有帮助。

node.js http-headers nuxt.js nuxt zeit-now
1个回答
0
投票

您的错误与时间和异步有关。在dev中,您不需要等待,因此服务器会稍微慢一些,应该发生类似authUser而不是userData的情况,在这种情况下,您将没有next()函数。

我重构了您的中间件,它将有所帮助。

const Cookies = require('cookies')
const admin = require('../services/firebase-admin-init')

export default (req, res, next) => {
  res.setHeader('Cache-Control', 's-maxage=1000, stale-while-revalidate')

  verifyCookie(req, res)
  .then(authUser => {
    fetchUserDetailsFromFirestore(
      req,
      authUser.uid,
      authUser.email_verified
    )
  })
  .catch((error) => {
    console.error(error)
  })
  .finally(() => {
    next()
  })
}
© www.soinside.com 2019 - 2024. All rights reserved.