使用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
相关产品推荐
相关产品推荐

