Как уже упоминалось, переменная сеанса в предварительной загрузке не совпадает с вашим хранилищем сеансов ... они просто имеют одно и то же имя, и это работает, потому что они изолированы по области видимости друг от друга.
Функция предварительной загрузки, предоставляемая sapper, работает как на клиенте, так и на сервере, тогда как хранилища - поскольку они являются частью svelte - существуют только на клиенте, поэтому импорт хранилища в предварительную загрузку невозможен, насколько я понимаю. осведомленный.
В моем случае при первом посещении моего приложения я хотел обновить сеанс, если сеанс уже существовал для клиента, с помощью файла cookie HttpOnly. Для меня наиболее очевидным местом для жизни этого кода является файл _layout.svelte.
Мое обходное решение заключалось в том, чтобы создать переменную currentSession
и присвоить ей данные сеанса следующим образом:
<script context="module">
export async function preload(page, session) {
let currentSession = session;
return { currentSession };
}
</script>
Затем в моем основном теге скрипта
<script>
export let currentSession; // <-- Needs export because it's a prop.
import { session } from '../stores.js';
session.set(currentSession);
// ...Do more stuff...
</script>
Это не идеальный вариант - мы оба хотим - а именно, переменная сеанса уже существует как хранилище с данными сеанса при импорте, но я думаю, это следующий лучший вариант. Основное преимущество заключается в том, что если вы инициализируете свои хранилища чем-то вроде let session = writeable(null);
, тогда $session
больше не будет null
к моменту загрузки вашего компонента.
Если вы придумали лучший способ, дайте мне знать. Спасибо.
person
Levi Mootz
schedule
15.12.2020
session
магазин и писать в него вpreload
. - person pishpish   schedule 15.08.2020