向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
相关产品推荐
相关产品推荐

