You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将SvelteKit路由数据传递给shadow endpoint .ts端点

核心逻辑说明

你现在的写法搞反了SvelteKit同路由Shadow Endpoint的执行顺序:

  • 当你访问/test/sample路径时,服务端会优先执行sample.ts里的get方法,把返回的内容组装成props之后,才会传递给sample.svelte组件完成渲染
  • 你在.svelte文件里定义的postId = 64是组件初始化阶段才会生成的变量,这时候对应的Shadow Endpoint早就执行完毕返回结果了,根本不可能反向把值传给提前运行的服务端逻辑。
具体实现方案

根据你的postId实际使用场景选对应方案即可:

场景1:postId是固定静态值

这种情况完全没必要把值定义在组件里,直接在Shadow Endpoint中声明即可,还可以把值一起返回给组件使用:
修改src/routes/test/sample.ts代码:

const postId = 64; // 直接在endpoint里定义固定值
export async function get() {
    return {
        body: {
            message: 'Selected post id is : ' + postId,
            postId: postId
        }
    };
}

对应修改src/routes/test/sample.svelte代码:

<script>
    export let message;
    export let postId; // 直接接收endpoint返回的postId即可
</script>

<h1>{message}</h1>

场景2:postId是客户端动态生成的值

如果postId是用户交互选择、客户端运行时计算出来的动态值,首次页面加载时endpoint拿不到这个值,可以选以下两种方式实现:

  • 方式一:通过URL查询参数传递
    跳转路由时把postId拼在URL查询参数里,比如访问路径为/test/sample?postId=64,endpoint可以直接从请求对象里读取参数:

    // src/routes/test/sample.ts
    export async function get({ url }) {
        const postId = url.searchParams.get('postId');
        return {
            body: {
                message: `Selected post id is : ${postId}`,
                postId: Number(postId)
            }
        };
    }
    

    组件里需要更新postId的时候,直接调用SvelteKit内置的goto方法跳转到带新查询参数的路径,就会自动重新触发endpoint执行拿到对应新数据。

  • 方式二:单独封装接口客户端主动调用
    如果不想改动路由路径,可以单独写一个接收postId参数的API接口,等组件里postId确定之后,主动用fetch调用接口拿数据:
    先新建接口文件src/routes/api/post/[postId].ts:

    export async function get({ params }) {
        return {
            body: {
                message: `Selected post id is : ${params.postId}`
            }
        }
    }
    

    再修改组件代码,在postId初始化完成后调用接口:

    <script>
        import { onMount } from 'svelte';
        let message = '';
        const postId = 64; // 组件内定义的动态postId
    
        onMount(async () => {
            const res = await fetch(`/api/post/${postId}`);
            const data = await res.json();
            message = data.message;
        })
    </script>
    
    <h1>{message}</h1>
    

注意:不要试图用全局变量在组件和endpoint之间传值,SvelteKit服务端是无状态运行的,全局变量会因为多实例部署、冷启动等问题出现值错乱,生产环境禁止这么写。

内容的提问来源于stack exchange,提问作者Vahid Iravani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:12:11