Angular5 - 错误:使用无效数据调用函数 DocumentReference.set()。数据必须是一个对象,但它是:一个自定义的 PlatformModel 对象

Posted

技术标签:

【中文标题】Angular5 - 错误:使用无效数据调用函数 DocumentReference.set()。数据必须是一个对象,但它是:一个自定义的 PlatformModel 对象【英文标题】:Angular5 - Error: Function DocumentReference.set() called with invalid data. Data must be an object, but it was: a custom PlatformModel object 【发布时间】:2018-10-10 21:20:00 【问题描述】:

我在谷歌上找到了一些人们解决这个问题的帖子。但我无法在我的项目中重现解决方案。

我的界面:

declare module PlatformInterface 

    export interface Design 
        primaryColor: string;
        backgroundImage: string;
    

    export interface Saga 
        id: string;
        name: string;
        short_desc: string;
        desc: string;
        manga: Manga[];
        anime: Anime[];
    

    export interface Root 
        id: string;
        name: string;
        design: Design[];
        saga: Saga[];
    


我的模特:

export class PlatformModel implements PlatformInterface.Root 
    id: string;
    name: string;
    design = [];
    saga = [];

    constructor(obj?: any) 
        this.id = obj.name.toLowerCase().replace(' ', '-');
        this.name = obj.name;
        this.design = obj.design;
        this.saga = obj.saga;
    

我的服务:

@Injectable()
export class PlatformService 

    public list$: Observable<PlatformModel[]>;

    private _platform: AngularFirestoreCollection<PlatformModel>;

    constructor(db: AngularFirestore) 
        this._platform = db.collection<PlatformModel>('platforms');
        this.list$ = this._platform.valueChanges();
    

    /** Get Platform by id */
    get(id: string): Observable<PlatformModel> 
        return this._platform.doc<PlatformModel>(id).valueChanges();
    

    /** Add / Update Platform */
    set(id: string, platforms: PlatformModel) 
        return fromPromise(this._platform.doc(id).set(platforms));
    

    /** Remove Platform */
    remove(id: string) 
        return fromPromise(this._platform.doc(id).delete());
    


我在 Component.ts 中的函数

constructor(public _platformService: PlatformService) 


addPlatform(name: string) 
    if (name !== '') 
        const platform = new PlatformModel(
            name: name,
            design: [],
            saga: []
        );

        this._platformService.set(platform.id, platform).subscribe();
    

Angular 编译器不会抛出任何错误,但是当我尝试触发 addPlatform 函数时,我在浏览器中出现此错误:

ERROR Error: Function DocumentReference.set() called with invalid data. Data must be an object, but it was: a custom PlatformModel object

错误说Data必须是一个对象,但它已经是一个对象了吗?我的意思是我在服务中定义它:

public list$: Observable<PlatformModel[]>;

[] 是否将其变为对象?

【问题讨论】:

【参考方案1】:

我在这里找到了一些澄清Firestore: Add Custom Object to db

虽然 firebase 可以将对象内的数据发送到数据库,但当数据返回时,它无法将其实例化回您的类的实例。因此不允许上课

我对自定义类的解决方法是

 this.db.collection(`$this.basePath/`).doc(custom_class.$key)
.set(Object.assign(, JSON.parse(JSON.stringify(custom_class))))
.then( ret => 
  log.debug('file added', ret);
).catch( err => 
  log.error(err);
);

所以我猜你的情况是

    /** Add / Update Platform */
set(id: string, platforms: PlatformModel) 
    return fromPromise(this._platform.doc(id).set(Object.assign(,JSON.parse(JSON.stringify(platforms))));

【讨论】:

如果custom_class 中有GeoPoint 类型字段怎么办?然后会转成地图,什么都不是你想要的。【参考方案2】:

要将地图添加到 Firestore 文档中,您必须使用:

Object.assign(, JSON.parse(JSON.stringify(YOUR_MAP)))

【讨论】:

以上是关于Angular5 - 错误:使用无效数据调用函数 DocumentReference.set()。数据必须是一个对象,但它是:一个自定义的 PlatformModel 对象的主要内容,如果未能解决你的问题,请参考以下文章

Angular Firebase 错误 ---- 使用无效数据调用的函数 DocumentReference.set()。不支持的字段值:未定义(在字段姓氏中找到)

为啥我在函数内部调用时会收到“错误:无效的挂钩调用”?

FirebaseError:使用无效数据调用的函数 addDoc()。不支持的字段值:未定义

React - 错误:无效的钩子调用。 Hooks 只能在函数组件的主体内部调用

× 错误:无效的挂钩调用。 Hooks 只能在函数组件的主体内部调用。[ReactJS]

使用无效数据调用的函数 DocumentReference.set()。不支持的字段值:未定义(在字段 firstName 中找到)