Cloud Function中Auth UserRecord调用toJSON报错,求转普通对象正确方法
正确获取Firebase Auth UserRecord普通对象的方式
首先,我得先理清两种常见的Firebase Functions版本场景,因为不同版本的写法差异会直接导致你遇到的问题:
情况1:使用Firebase Functions v1版本
在v1中,auth.user().onCreate的回调参数是event,event.data确实是UserRecord实例。你遇到toJSON()报错的情况,大概率是因为Functions版本过旧,或者在特定环境下toJSON()方法没有被正确暴露。
这时候可以用更可靠的方式将UserRecord转为普通对象:
- 扩展运算符解构:直接把实例的所有可枚举属性复制到新对象
const userData = {...event.data}; - Object.assign:同样能复制所有可枚举属性
const userData = Object.assign({}, event.data);
这两种方式都能得到包含用户核心属性(比如uid、email、displayName等)的普通JS对象,完全可以直接写入Firestore。
情况2:使用Firebase Functions v2及以上版本
v2已经简化了回调参数,不再需要通过event.data获取用户数据,直接接收UserRecord实例作为参数:
const { onUserCreated } = require('firebase-functions/v2/auth'); const admin = require('firebase-admin'); admin.initializeApp(); exports.writeUserToFirestore = onUserCreated(async (user) => { // 这里直接调用toJSON()就能正常工作 const userData = user.toJSON(); // 或者用解构/Object.assign替代 // const userData = {...user}; await admin.firestore().collection('users').doc(user.uid).set(userData); });
在v2版本中,UserRecord的toJSON()方法是稳定可用的,不会出现你遇到的类型错误。
关于你当前用的JSON.parse(JSON.stringify(event.data))
这种方式确实可行,因为它会序列化UserRecord的所有可枚举属性,再解析为普通对象。但它的效率略低于上面提到的方法,而且如果对象存在循环引用(虽然UserRecord不存在这种情况)会出问题,所以更推荐用前面的方式替代。
内容的提问来源于stack exchange,提问作者w--
相关产品推荐
相关产品推荐

