删除对象和存储角度Firebase

时间:2018-12-03 20:32:47

标签: angular firebase firebase-realtime-database firebase-storage angularfire2

我正在Angular和Firebase中进行我的第一个项目,我快完成了。

我有一个关于同时使用两个对象删除对象的问题。我有一项将删除对象的服务。该对象内部还有另一个称为“图片”的对象,该对象具有两个属性key: stringurl: string

我想确保在删除该对象时也从存储中删除文件,我发现这种方式行得通,但是我认为这不是正确的方式,特别是因为出现TS错误:

  

“错误TS2339:类型'{}'上不存在属性'picture'。”

有人可以帮我吗?这是我的删除方法

deleteEvent(id: string) {
        const obj = this.db.object(this.NODE + id);
        const getPic = obj.snapshotChanges().subscribe(
            (a) => {
                console.log(a.payload.val());
                this.storage.ref(this.NODE + a.payload.val().picture.key).delete();
            }
        );
        return obj.remove();
    }

1 个答案:

答案 0 :(得分:1)

我会说你有要点。如果唯一困扰您的是Linting错误,则可以使用方括号表示法代替点表示法:this.NODE + a.payload.val()['picture']['key'] ...如果情况破裂,我可能会在其中引入一些错误处理。

一方面,对于一个小的改进,我建议不要仅使用预订一次从数据库中获取数据。 AngularFire2提供了一种方法,可以以较少的开销来设置可观察项/订阅项(无论如何将其删除)。如果要这样做,我会写成这样:

deleteEvent(id: string)
{
    return this.db.database.ref(this.NODE + id).once('value').then( data => {
        console.log(data.val());
        return this.storage.ref(this.NODE + a.payload.val()['picture']['key']).delete().then( () => {
            console.log('Success!');
            return this.db.database.ref(this.NODE + id).remove();
        }).catch( err => {
            console.log(`Error deleting ${this.NODE + a.payload.val()['picture']['key']} from storage:`);
            console.log(err);
        });
    }).catch( err => {
        console.log(`Error obtaining /${this.NODE + id} from the database:`);
        console.log(err);
    });
}

* 未经测试的代码

我是Promise的忠实拥护者(,好像你听不懂),而AngularFire2经常使用它们-使得处理错误变得更加容易。