javascript - Sapper.js - 预加载 cookie/标题?
问题描述
我正在使用 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
.
有什么想法吗?
解决方案
您可以{ 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 随请求一起发送。但是,根据定义,这不适用于导出的应用程序 - 必须为每个用户构建响应。
推荐阅读
- r - 在 R 中按匹配的因子水平传播
- django - 使用 nginx 和 daphne 部署 django、channels 和 websockets
- javascript - 如何获取每月数据库记录的数量 Sequelize
- ms-access - 关于在拆分表单数据表中打开下一条记录的 MS Access 问题
- java - HQL 缺少关键字
- mysql - MySQL查询计算大于10的结果然后分组
- arduino - ESP32 + TLC5940
- python - How to get the mean of a 3D array over 2D?
- javascript - 如何使用弹出式 Chrome 扩展程序请求和捕获地理位置
- authentication - 每个用户的 Directus 访问令牌