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

向Google Firestore写入时遇'Object is not extensible'错误求助

解决Firestore添加文档时的"object is not extensible"错误

这个错误的核心原因是你尝试返回了一个被Firebase冻结(不可扩展)的对象——Firebase为了防止意外修改,会将UserCredential中的user实例设置为不可扩展状态,当后续代码试图给它添加属性(比如错误提示里的索引0,可能是某些逻辑把它当作数组操作)时就会抛出这个错误。

解决方案1:将Firebase用户对象转换为普通可扩展对象

修改返回语句,把不可扩展的user对象转换成普通对象,避免后续操作触发错误:

async addUser(
  user: UserCredential,
  displayName: string
): Promise<Observable<CreateUserResponse>> {
  try {
    const userData = {
      displayName,
    };
    await setDoc(doc(this.firestore, 'users', user.user.uid), userData); // 直接传userData即可,无需展开
    console.log('Document written with ID: ', user.user.uid);
    
    // 将Firebase的User对象转为普通可扩展对象
    const extensibleUser = {
      ...user,
      user: { ...user.user } // 解构user实例为普通对象
    };
    
    return observableOf({ response: extensibleUser, displayName });
  } catch (exception) {
    console.error('Error adding document: ', exception);
    
    // 确保DEFAULT_DATABASE_ERROR是可扩展的普通对象,若不是则转换
    return observableOf({ response: { ...DEFAULT_DATABASE_ERROR }, displayName });
  }
}

解决方案2:仅返回需要的用户字段

如果不需要完整的UserCredential对象,可以只提取必要字段返回,进一步规避不可扩展对象的问题:

// 在try块的返回部分替换原有代码
const userInfo = {
  uid: user.user.uid,
  email: user.user.email,
  displayName: user.user.displayName
};
return observableOf({ response: { ...user, user: userInfo }, displayName });

额外排查点

  • 检查DEFAULT_DATABASE_ERROR是否也是不可扩展对象,如果是,同样需要用解构或Object.assign转为普通对象后再返回。
  • 确认你的CreateUserResponse类型定义是否要求response为可扩展对象,若类型有特殊限制,需对应调整返回的数据结构。

内容的提问来源于stack exchange,提问作者HalfMillennium

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:55:08