预加载期间如何写入会话存储

时间:2019-12-02 18:57:31

标签: svelte sapper

我知道在sapper中的会话是可写的存储。 我可以这样写:

<script>
    import { stores } from "@sapper/app"
    const { session } = stores()
    session.set("new value")
</script>

但是,我很难在preload函数中编写内容:

<script context="module">
    export async function preload(page, session) {
        session = "new value" // not working, this is just a value, not a store
    }
</script>

我需要在_layout.svelte预加载期间在那里设置一些数据。有支持的方式吗?

编辑 我最终根本没有使用会话,只是一个简单的可写存储。它不是那么干净,但是可以达到目的。如果有人找到方法或将来得到支持,则不要公开。

2 个答案:

答案 0 :(得分:1)

这里的session参数不是会话存储,而是其他东西。它在the docs中有用:

  

会话是通过传递给sapper.middleware的session选项在服务器上生成的(TODO需要进一步的文档。也许是服务器API部分?)

修改:

[先前建议删除,因为不正确]

出于完整性考虑:sessionsession商店显然有关,该参数是商店的值。但是,您仍然无法以有意义的方式写信。

就像我在评论中说的那样,我认为preload中您想做的事是不可能的。不过,也许我错了,其他人可能会告诉你。

同时,我建议采用以下解决方法:在_layout组件 instance 中完成所有这些操作。在那里,您可以完全访问商店。像这样的东西,例如:

<script>
  import { stores } from '@sapper/app'

  import { resolveAuth } from './your/utils'

  const { session } = stores()

  resolveAuth()
    .then(auth => { $session = auth })
    .catch(err => { ... })
</script>

{#if $session}
  <slot />
{:else}
  <!-- loading indicator... or not -->
{/if}

答案 1 :(得分:1)

如前所述,预加载中的会话变量与会话存储不同...它们只是碰巧使用相同的名称,并且之所以起作用,是因为它们在范围上相互隔离。

sapper提供的preload功能在客户端和服务器上都可以运行,而store(因为它们是svelte的一部分)仅在客户端上存在,因此就不可能将存储导入到preload中。我知道。

就我而言,在第一次访问我的应用程序时,如果要使用HttpOnly cookie为客户端建立会话,我想更新会话。对我来说,最明显的地方是_layout.svelte文件。

我的解决方法最终是创建一个# the commented sections have not worked. #* * * * * php /var/www/html/artisan schedule:run >> /var/www/html/schedule-run.log #* * * * * /usr/local/bin/php /var/www/html/artisan schedule:run >> /var/www/html/schedule-run.log #* * * * * cd /var/www/html/ && /usr/local/bin/php artisan schedule:run >> /var/www/html/schedule-run.log * * * * * cd /var/www/html/ && /usr/local/bin/php artisan schedule:run 变量,并向其分配会话数据,如下所示:

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

如果您想出一种更好的方法,请告诉我。谢谢。