Настройка заголовка Cache-Control в Nuxt JS работает на локальном хосте, но не работает - PullRequest
0 голосов
/ 28 октября 2019

При развертывании моего универсального приложения Nuxt JS на Zeit Now я пытался воспользоваться преимуществом заголовка Zeit Cache-Control, который упоминается в Zeit Cache Doc .

Затем я попытался найти способ добавить заголовок 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 т.е. yarn nuxt и проверяю свой сайт через localhost, я легко вижу добавленный заголовок в Chrome NetworkИнструмент.

header showing up in localhost

Но когда я отправляю свой проект в Zeit Now для хостинга с использованием now --prod и проверяю свой фактический сайт, я не вижу этот заголовок.

no header in production

Теперь я не понимаю, делаю ли я что-то не так, потому что если я это сделал, это не должно было появиться в ответе разработчика 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/**"
        ]
      }
    }
  ]
}

Если кто-то может помочь в этом вопросе, было бы очень полезно.

1 Ответ

1 голос
/ 28 октября 2019

Ваша ошибка связана со временем и асинхронностью. В dev все работает быстро, но в prod вам нужно подождать, пока обещания не будут выполнены, сервер немного медленнее. Должно происходить что-то вроде, если 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)
    })
}
...