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

使用SvelteKit从Firebase获取数据时遇非POJO序列化错误求助

解决SvelteKit从Firebase获取数据时的序列化错误

错误根源是Firebase返回的date字段属于Timestamp/Date对象,并非SvelteKit要求的可序列化POJO(普通JavaScript对象)。SvelteKit的load函数返回的数据必须能被JSON序列化,因此需要将日期对象转换为字符串或时间戳格式。

步骤1:修改+page.server.js处理日期字段

遍历Firebase文档时,对date字段进行格式转换:

export async function load() {    
    let days_data = [];    
    const querySnapshot = await dailyStatusCollection.get();        
    querySnapshot.forEach(doc => {
        const docData = doc.data();
        // 将Firebase Timestamp转为ISO字符串(保留可读格式)
        const processedData = {
            ...docData,
            id: doc.id,
            date: docData.date?.toDate().toISOString()
            // 可选方案:转成时间戳 -> date: docData.date?.toMillis()
        };
        days_data.push(processedData);
    })    
    return { days_status: { days_data } }
}

步骤2:修正+page.svelte的遍历逻辑

原代码中days_status是包含days_data数组的对象,遍历目标应为days_data:

<script>
    /**
    * @type {{ days_status: { days_data: Array<{ id: string; status: string; date: string }> } }}
    */
    export let data
</script>

{#each data.days_status.days_data as d}
    {d.status} - {d.date}
{/each}

补充说明

  • 若date是Firebase的Timestamp类型,必须先用.toDate()转为JavaScript Date对象,再转成字符串;如果本身就是Date对象,直接调用.toISOString()即可。
  • SvelteKit的服务端load函数返回的数据会被序列化后传递给客户端,所有非JSON兼容类型(如Date、Map、Set等)都需要提前转换为可序列化格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:05:14