Angular5 - Ошибка: функция DocumentReference.set () вызвана с неверными данными. Данные должны быть объектом, но это был: пользовательский объект PlatformModel - PullRequest
0 голосов
/ 30 апреля 2018

Я уже нахожу несколько постов в Google, где люди решают эту проблему. но я не могу воспроизвести решения по моему проекту.

Мой интерфейс:

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();
    }
}

Угловой компилятор не выдает никакой ошибки, но когда я пытаюсь запустить функцию addPlatform, я получаю в браузере эту ошибку:

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

Ошибки Говорят, что Данные должны быть объектом, но это уже объект или нет? я имею в виду, я определяю в сервисе это с:

public list$: Observable<PlatformModel[]>;

[] Делает это объектом или нет?

1 Ответ

0 голосов
/ 14 мая 2018

Я нашел здесь некоторые пояснения Firestore: Добавить пользовательский объект в 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))));
}
...