LayoutServerLoad
在我的 SvelteKit 网站中,我在函数内部向后端发出请求+layout.server.ts
。即当使用查询参数打开网站时?affiliate_id=bla
,我想将其发送到后端:
import type { LayoutServerLoad } from "./$types";
import { keyBy } from "$lib/utils";
import { backendUrl } from "$lib/config";
export const trailingSlash = "always";
export const load: LayoutServerLoad = async ({ locals, url, fetch }) => {
const affiliate_id = url.searchParams.get("affiliate_id");
if (affiliate_id) {
const headers = {
"Content-Type": "application/json",
"X-CSRFToken": locals.csrfToken,
};
fetch(`${backendUrl}/shop/basket/`, { method: "POST", credentials: "include", headers, body: JSON.stringify({ affiliate_id }) })
.catch(error => {
console.error("Error storing affiliate_id: ", error);
});
}
return {
// I'm returning a bunch of data here
};
};
问题是后端响应包含set-cookie
标头,并且 cookie 没有存储在浏览器中。
当我将load
函数更改为仅返回affiliate_id
:
export const load: LayoutServerLoad = async ({ locals, url }) => {
return {
affiliateId: url.searchParams.get("affiliate_id"),
// and more data
};
};
然后在里面发出请求+layout.svelte
,那么一切就正常工作了。
<script lang="ts">
import type { PageData } from "./$types";
import { onMount } from "svelte";
export let data: PageData;
const { affiliateId } = data;
onMount(async () => {
if (affiliateId) {
// Do the request here
}
});
</script>
<slot />
现在,响应中的 cookie 已正常存储在浏览器中。
为什么在函数中做同样的请求时,cookie没有被存储呢load
?
服务器加载函数中的请求由服务器而不是客户端的浏览器发出;客户端默认不会收到任何 cookie(尽管在发出请求时有一些转发 cookie 的逻辑)。
服务器加载函数事件对象有一个
cookies
属性,可用于转发 cookie。这可能有点绕弯子,因为必须先解析返回的标头(如果尝试Set-Cookie
直接设置标头,则会出错)。