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

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--

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:35:29