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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:09:44