2

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

然后我试图寻找如何Cache-Control在我的 Nuxt JS 应用程序中添加标题,幸运的是发现了这个 GitHub 问题,它解释了同样的事情。

现在,当我serverMiddleware在 Nuxt 应用程序中使用反正来获取当前登录用户的数据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 ieyarn 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/**"
        ]
      }
    }
  ]
}

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

4

1 回答 1

3

您的错误与时间和异步有关。在 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)
    })
}
于 2019-10-28T17:56:17.300 回答