我正在使用 Sapper.js 为我的应用程序提供动力,但仅使用运行创建的静态内容sapper export
。所以没有服务器渲染页面。
我使用 AWS CloudFront 和 Lambda@Edge 在用户HttpOnly
请求页面时对用户的 cookie 执行身份验证。如果用户通过身份验证,Lambda 将获取用户数据,例如用户的个人资料图片、用户名等,并在 CloudFront 返回的页面上的自定义标头/cookie(非 HttpOnly)中设置这些值。
这些值可以在标头或 cookie 中设置,两者都没有要求。
但是我需要在呈现页面之前让客户端可以使用此动态内容,以避免出现难看的空内容。所以应该在 sapper 的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
对象,而不是尝试将其提供给客户端。
然后我们可以运行并使用Lambda 中npm run build
的整个目录。build
之后我们可以自由地将任何用户数据传递到中间件session
对象中,正如文档中解释的那样:
sapper.middleware({session: (CUSTOM_REQ, CUSTOM_RES) => ({user: CUSTOME_REQ.user})})
无需获取任何数据,因为它现在应该可以在store
.
有什么想法吗?