【问题标题】:Setting Cache-Control header in Nuxt JS works on localhost but not in production在 Nuxt JS 中设置 Cache-Control 标头适用于 localhost 但不适用于生产
【发布时间】:2020-02-23 19:39:50
【问题描述】:

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

然后我试图寻找如何在我的 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)
  }
}

现在最疯狂的是,当我运行 dev 即yarn nuxt 并通过 localhost 检查我的网站时,我可以很容易地在 Chrome 网络工具中看到我添加的标题。

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

现在我不明白我是否做错了什么,因为如果我做错了,它不应该出现在 localhost 开发响应标头中。我花了很多天试图解决这个问题,但无处可去。不知道为什么会这样。我还在使用 nuxt/now-builder 进行 Zeit 部署,这是我的 now.json 文件。

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

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

【问题讨论】:

  • 你添加serverMiddleware: ['/serverMiddleware/handleCookie.js'],
  • @Pablote 当然人......

标签: node.js http-headers nuxt.js vercel


【解决方案1】:

您的错误与时间和异步有关。在 dev 中,一切都运行得很快,但在 prod 中,您需要等待更长的时间才能解决 Promise,服务器有点慢。应该发生类似 if authUser 但不是 userdata 的情况,在这种情况下,您没有 next() 函数。

我正在重构你的中间件,下面的代码结构应该会有所帮助。

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

  verifyCookie(req, res)
    .then((authUser) => {
      if (authUser) {
        fetchUserDetailsFromFirestore(
          req,
          authUser.uid,
          authUser.email_verified
        )
          .then(() => {
            next()
          })
          .catch((error) => {
            console.error(error)
          })
      } else {
        next()
      }
    })
    .catch((error) => {
      console.error(error)
    })
}

【讨论】:

  • 非常感谢您提供的代码。我会尝试一下,希望它会奏效。现在我正在投票,因为我现在无法测试它。测试后我会将其标记为答案。非常感谢你......不能感谢你。我没有 else 用于 if not userData 的原因是,除非有人去生产 firestore db 并删除该用户数据,同时保持 firebase 身份验证,否则不可能发生这种情况。哈哈!我认为这很疯狂......:D
猜你喜欢
  • 2013-07-13
  • 2015-07-18
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 2018-08-22
  • 2011-09-20
  • 2016-11-08
  • 1970-01-01
相关资源
最近更新 更多