Angular应用Firestore删除字段报错:Unsupported field value求助
针对你碰到的这个问题,我分享几个实际排查和解决的思路:
检查FieldValue的正确使用方式
有时候会因为导入或引用方式错误导致这个问题。确保你是从正确的路径获取FieldValue:// 方式一:通过firebase包引用 import * as firebase from 'firebase/app'; import 'firebase/firestore'; // 方式二:直接从Angular Fire导入 import { AngularFirestore, FieldValue } from '@angular/fire/firestore';如果使用Angular Fire提供的FieldValue,直接调用
FieldValue.delete()即可,不需要再通过firebase.firestore路径调用,避免出现实例不匹配的问题。验证依赖版本兼容性
你当前使用的@angular/fire: 5.2.1和firebase: 6.1.1可能存在版本兼容问题。@angular/fire 5.x系列通常更适配Firebase 5.x版本,你可以尝试:- 降级firebase到5.9.4左右(这个版本和@angular/fire 5.2.1兼容性较好)
- 或者升级@angular/fire到5.4.x及以上版本(该版本开始支持Firebase 6.x)
操作后记得清理npm/yarn缓存,重新安装依赖再测试。
排查重复的Firebase实例
项目中同时引入firebaseui和angular fire可能导致多个Firebase实例共存,引发FieldValue对象不被当前实例识别的问题。可以检查package-lock.json或yarn.lock文件,确保所有依赖的firebase版本保持一致,避免版本冲突。尝试替代方案临时验证
如果以上方法都没效果,可以试试先获取文档数据,再通过set方法并设置merge: true来删除字段:this.fStore.doc('/test/ZJ6UMPjc7DEQdKKphTxJ').get().subscribe(doc => { const data = doc.data(); delete data.t1; this.fStore.doc('/test/ZJ6UMPjc7DEQdKKphTxJ').set(data, { merge: true }); });这个方法虽然不如直接用
FieldValue.delete()优雅,但可以帮助你确认是不是FieldValue的实例问题,而不是文档操作本身的问题。确认Firebase初始化配置
确保在你的Angular根模块中正确初始化了AngularFireStore:import { AngularFireModule } from '@angular/fire'; import { AngularFirestoreModule } from '@angular/fire/firestore'; import { environment } from '../environments/environment'; @NgModule({ imports: [ AngularFireModule.initializeApp(environment.firebase), AngularFirestoreModule ] }) export class AppModule { }错误的初始化配置也可能导致Firestore API无法正常识别FieldValue对象。
内容的提问来源于stack exchange,提问作者Jeff Plummer

