Сессия Sapper не настраивается должным образом в производственной сборке без перезагрузки страницы

Я работаю над проектом с использованием Sapper, и сейчас немного борюсь с чем-то - не могу понять. Я использую Polka для своего сервера (он был включен в шаблон sveltejs/sapper-template#rollup, поэтому я выбрал it) и cookie-session для промежуточного программного обеспечения сеанса.

Вот моя конфигурация Polka, в которой я также исходные данные сеанса:

polka()
  .use(
    compression({ threshold: 0 }),
    sirv('static', { dev }),
    cookieSession({ 
      name: 'session', 
      keys: [
        '6e818055-d346-4fcb-bf56-4c7d54cb04ab', 
        '60f3e980-6e9c-460d-8ea7-af1fffbdb92f'
      ]
    }),
    sapper.middleware({
      session: (req, res) => ({
        user: req.session.user
      })
    })
  )
  .listen(PORT, err => {
    if (err) console.log('error', err);
  });

Когда пользователь входит в систему, он обрабатывается routes/login.js, по сути, некоторая информация профиля и токены устанавливаются на session.user, а запрос перенаправляется обратно на корневой путь. Я использую @polka/send-type, чтобы ответить. См. ниже:

req.session.user = { 
  accessToken: access_token,
  name: first_name,
  pic: picture.data.url
};
send(res, 302, '', {
  Location: appUrl
});

Там у меня есть модуль предварительной загрузки для routes/index.svelte проверок, существует ли session.user, и если да, перенаправляет на панель инструментов:

<script context="module">
  export async function preload(page, session) {
    const { user } = session;

    if (user) {
      return this.redirect(302, "dashboard");
    }
   }
</script>

Все это отлично работает в dev, но когда я npm run build строю для производства, это не очень хорошо. Похоже, что session.user не заполняется после перенаправления в login.js.

Объект session, который я получаю в preload, не имеет session.user, установленного после входа в систему, и наоборот, при выходе из системы, где session.user просто имеет значение null, а клиент перенаправляется в корень, session.user все еще заполнен.

Если я обновлю браузер, session.user находится в правильном состоянии. Без обновления - если я только что вышел из системы, я могу щелкнуть мышью, как если бы я вошел в систему, а если я только что вошел в систему, ничего не происходит, поскольку session.user это undefined.

Просто не уверен, почему это сработает в сборке разработчика, но не в продакшене. Учитывая, что состояние session.user является правильным при обновлении браузера, я предполагаю, что это не проблема с конфигурацией промежуточного программного обеспечения cookie. Похоже, я чего-то не хватает. Любая помощь будет очень признательна!


person Dmitry Petrov    schedule 19.09.2019    source источник


Ответы (1)


Sapper действительно обрабатывает заголовки кеша по-разному для среды разработки и производства. Вот почему вы так переживаете.

Но есть простое решение - изменить функцию sapper.middleware:

    sapper.middleware({
      session: (req, res) => {
        res.setHeader('cache-control', 'no-cache, no-store')
        return { user: req.session.user }
      }
    })

Это устанавливает кеш-контроль, как вы этого хотите.

person Jean-Claude Schmidig    schedule 14.02.2020