在Cloud Function中对比Firestore与Node.js时间戳报错求助
解决Firestore Timestamp序列化后
toDate()不是函数的问题 错误原因
当Firestore的Timestamp对象经过序列化(比如Cloud Function通过HTTP触发时的请求数据传递、或数据被转为JSON存储),会丢失其原型方法,变成仅包含_seconds和_nanoseconds字段的普通JS对象,或是ISO格式的字符串,这时候调用toDate()自然会报错。
解决方案
根据序列化后的不同数据格式,有以下几种处理方式:
1. 处理序列化后的Timestamp对象(含_seconds/_nanoseconds)
使用Firestore SDK提供的Timestamp.fromObject()方法,将普通对象还原为Timestamp实例,再调用toDate():
const orderRef = await admin .firestore() .collection('orders') .doc(orderId) .get(); const rawCreatedAt = orderRef.data()!.createdAt; // 还原为Timestamp对象 const createdAtTimestamp = admin.firestore.Timestamp.fromObject(rawCreatedAt); const createdAt = createdAtTimestamp.toDate(); const currentTime = new Date(); const diff = currentTime.getTime() - createdAt.getTime(); const diffInMinutes = Math.floor(diff / 60000); console.log('Diff in minutes: ' + diffInMinutes); if (diffInMinutes <= 10) { // 执行逻辑 }
2. 处理ISO格式的时间字符串
如果序列化后的数据是ISO字符串(比如"2024-05-20T12:34:56.789Z"),直接用new Date()转换即可:
const rawCreatedAt = orderRef.data()!.createdAt; const createdAt = new Date(rawCreatedAt); // 后续时间计算逻辑同上
3. 兼容多种格式的健壮写法
为了避免因数据格式不确定导致的错误,可以先判断类型再处理:
const rawCreatedAt = orderRef.data()!.createdAt; let createdAt; if (typeof rawCreatedAt === 'string') { createdAt = new Date(rawCreatedAt); } else if (rawCreatedAt._seconds && rawCreatedAt._nanoseconds) { const timestamp = admin.firestore.Timestamp.fromObject(rawCreatedAt); createdAt = timestamp.toDate(); } else if (rawCreatedAt.toDate instanceof Function) { // 已经是Timestamp实例的情况 createdAt = rawCreatedAt.toDate(); } // 后续逻辑
内容的提问来源于stack exchange,提问作者Rishabh
相关产品推荐
相关产品推荐

