Firebase Cloud Functions认证触发Firestore添数据报错:无法编码类型
解决Firestore写入时的Undefined编码错误
你的错误根源很清晰:当用户创建账号时,user.displayName可能为undefined(比如用户通过邮箱密码注册,没有设置昵称),而Firestore不允许将undefined类型的值写入文档,这就触发了你看到的编码错误。
修复方案:处理可能为空的字段
我们可以通过两种方式解决这个问题:
方式1:为displayName设置默认值
如果用户没有提供displayName,我们可以用邮箱前缀或者默认名称代替,保证写入Firestore的字段值始终有效:
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); // 新版本SDK无需传入functions.config().firebase,初始化逻辑已简化 const db = admin.firestore(); exports.addUserData = functions.auth.user().onCreate((user) => { // 新版本SDK直接接收user对象,无需从event.data获取 // 处理displayName:优先用用户设置的名称,没有则取邮箱前缀,再没有用默认值 const displayName = user.displayName || (user.email ? user.email.split('@')[0] : '匿名用户'); return db.collection('peoples').doc(user.uid).set({ name: displayName, uid: user.uid }); });
方式2:过滤掉值为undefined的字段
如果你不想写入默认值,只想保留用户实际提供的字段,可以先构建数据对象,再过滤掉属性值为undefined的项:
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); const db = admin.firestore(); exports.addUserData = functions.auth.user().onCreate((user) => { const userData = { uid: user.uid }; // 仅当displayName存在时,才将其加入数据对象 if (user.displayName) { userData.name = user.displayName; } return db.collection('peoples').doc(user.uid).set(userData); });
额外提示:SDK版本兼容
你的代码使用了旧版Cloud Functions SDK的写法(event.data),现在新版本SDK中,onCreate触发器会直接将user对象作为参数传入,无需从event.data获取,上面的修复代码已经更新了这个逻辑,能避免一些版本兼容问题。
内容的提问来源于stack exchange,提问作者Niyas
相关产品推荐
相关产品推荐

