我知道在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
预加载期间在那里设置一些数据。有支持的方式吗?
编辑 我最终根本没有使用会话,只是一个简单的可写存储。它不是那么干净,但是可以达到目的。如果有人找到方法或将来得到支持,则不要公开。
答案 0 :(得分:1)
这里的session
参数不是会话存储,而是其他东西。它在the docs中有用:
会话是通过传递给sapper.middleware的session选项在服务器上生成的(TODO需要进一步的文档。也许是服务器API部分?)
修改:
[先前建议删除,因为不正确]
出于完整性考虑:session
与session
商店显然有关,该参数是商店的值。但是,您仍然无法以有意义的方式写信。
就像我在评论中说的那样,我认为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
。
如果您想出一种更好的方法,请告诉我。谢谢。