
[英]Svelte/Sapper.js - How to initialize store with localStorage data?
[英]Sapper.js - Preload with cookies/headers?
我正在使用 Sapper.js 为我的应用程序提供支持,但仅使用通过运行sapper export
创建的静态内容。 所以没有服务器渲染页面。
我将 AWS CloudFront 与 Lambda@Edge 结合使用,以便在用户请求页面时对用户的HttpOnly
cookie 执行身份验证。 如果用户通过身份验证,Lambda 将获取用户数据,例如用户的个人资料图片、用户名等,并在 CloudFront 返回的页面上的自定义标头/cookie(非 HttpOnly)中设置这些值。
这些值可以在标头或 cookie 中设置,两者都没有要求。
但是我需要在呈现页面之前让客户端可以使用这些动态内容,以避免出现丑陋的空内容闪烁。 因此,应该在onMount
的preload
函数而不是onMount
中检索它,以便在数据返回之前阻止任何其他 html 的呈现。
我知道如何在preload
函数内部获取,如下所示:
<script context="module">
export async function preload(page, session) {
const res = await this.fetch("SOME_ENDPOINT");
const data = await res.json();
return {data};
}
</script>
但我不确定如何从该函数中访问标头或 cookie。
编辑:新方法?
所以我一直在想,目前看来最好的方法是尝试转换 Sapper 的sapper.middleware
函数,使其接受自定义req
对象并返回res
对象,而不是尝试将其提供给客户端.
然后我们可以运行npm run build
并使用 Lambda 中的整个build
目录。 之后我们可以自由地将任何用户数据传递到中间件session
对象中,如文档中所述:
sapper.middleware({session: (CUSTOM_REQ, CUSTOM_RES) => ({user: CUSTOME_REQ.user})})
无需获取任何数据,因为它现在应该在store
可用。
有什么想法吗?
您可以将{ credentials: true }
作为第二个选项传递给this.fetch
(与常规fetch
相同):
export async function preload(page, session) {
const res = await this.fetch("SOME_ENDPOINT", {
credentials: true
});
const data = await res.json();
return {data};
}
这将导致 cookie 与请求一起发送。 但是,根据定义,这不适用于导出的应用程序 - 必须为每个用户构建响应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.