Flutter调用Callable云函数传Timestamp参数报_debugIsValidParameterType错误
解决Firebase Callable函数传递Timestamp的报错问题
问题原因
Firebase Callable云函数仅支持传递JSON可序列化的基本类型(字符串、数字、布尔值、数组、普通键值对对象),而Flutter中的Timestamp是自定义对象,无法直接序列化,因此触发_debugIsValidParameterType断言错误。
两种可行解决方案
方案1:将Timestamp转为毫秒数/秒数传递
在Flutter端把Timestamp转换成毫秒数(或秒数),云函数接收后再转回Firestore的Timestamp:
Flutter端代码:
// 转换Timestamp为毫秒数 final userProfileJSON = { "name": "asdasd", "bio": "", "bornDate": userTimestamp.millisecondsSinceEpoch, // 也可使用seconds获取秒数 }; // 调用Callable函数 await _firebaseFunctions.httpsCallable("updateUserProfile").call({ "profileJSON": userProfileJSON, });
Node.js云函数代码:
const admin = require('firebase-admin'); admin.initializeApp(); exports.updateUserProfile = functions.https.onCall(async (data, context) => { const { profileJSON } = data; // 将毫秒数转回Firestore Timestamp const bornDate = admin.firestore.Timestamp.fromMillis(profileJSON.bornDate); // 若传递的是秒数,改用fromSeconds方法: // const bornDate = admin.firestore.Timestamp.fromSeconds(profileJSON.bornDate); // 写入Firestore await admin.firestore().collection('users').doc(context.auth.uid).update({ ...profileJSON, bornDate: bornDate }); return { success: true }; });
方案2:将Timestamp转为Firestore兼容的JSON结构传递
Flutter端把Timestamp拆分为包含_seconds和_nanoseconds的普通对象,云函数直接用这两个值重建Timestamp:
Flutter端代码:
// 转换Timestamp为可序列化的Map final userProfileJSON = { "name": "asdasd", "bio": "", "bornDate": { "_seconds": userTimestamp.seconds, "_nanoseconds": userTimestamp.nanoseconds, }, }; // 调用Callable函数 await _firebaseFunctions.httpsCallable("updateUserProfile").call({ "profileJSON": userProfileJSON, });
Node.js云函数代码:
const admin = require('firebase-admin'); admin.initializeApp(); exports.updateUserProfile = functions.https.onCall(async (data, context) => { const { profileJSON } = data; // 用传递的秒数和纳秒数重建Timestamp const bornDate = new admin.firestore.Timestamp( profileJSON.bornDate._seconds, profileJSON.bornDate._nanoseconds ); // 写入Firestore await admin.firestore().collection('users').doc(context.auth.uid).update({ ...profileJSON, bornDate: bornDate }); return { success: true }; });
内容的提问来源于stack exchange,提问作者Alex Stroescu
相关产品推荐
相关产品推荐

