【问题标题】:How to update value to firebase database with Angular 5如何使用 Angular 5 将值更新到 firebase 数据库
【发布时间】:2018-01-20 18:26:25
【问题描述】:

我想做一个upvote 功能。我有一些使用 Firebase 存储在数据库中的帖子。我想让人们对帖子投赞成票(或反对票)。

这是在我的 ctrl 中:

upvote(advice) {
    advice.votes = advice.votes + 1;
    return this.httpService.updateData(advice)
    .subscribe((res:Response) => {
        console.log('in subscribe', res);
    });
}

在我的服务中:

updateData (data:any): Observable<any> {

    let datas = JSON.stringify(data);
    const headers = { 'Authorization': 'secret' };

    return this.http.put(this.url + 'data.json', datas, headers)
        .catch((e) => {
            console.log(e);
        })
        .finally(() => {
            console.log('finally');
        })
}

当我在控制器内的 subscribe 方法中检查响应时,我可以看到更新的值,但我的数据库现在已被破坏。

之前:

之后:

如您所见,之后不再有实物,它取代了一切。 我想我必须更改网址或检查帖子 ID,但我不知道该怎么做。 我在 firebase 文档中没有找到任何内容。所以如果有人有想法..

@Luke 回答后编辑

我这样更新了我的代码:

在我的 ctrl 中:

upvote(advice) {
    advice.votes = advice.votes + 1;
    return this.httpService.updateData(advice)
    .subscribe((res:Response) => {
        console.log(res);
        return res;
    })
}

在服务中:

getId() {
    this.db.list('data').snapshotChanges().map(actions => {
        return actions.map(action => ({ key: action.key, ...action.payload.val() }));
    }).subscribe(items => {
        return items.map(item => item.key);
    });
}

updateData (data:any): Observable<any> {

    let updateUrl = this.url + '-p1FFxUqY6u1_AZ3ER4eVUt';

    let datas = JSON.stringify(data);
    const headers = { 'Authorization': 'secret' };

    return this.http.put(updateUrl + 'data.json', datas, headers)
        .catch((e) => {
            console.log(e);
        })
        .finally(() => {
            console.log('finally');
        })
}

我可以在日志和前面看到投票计数器更新,但在数据库中看不到。当我刷新页面时,投票又回到 0。 我想我只是忘记了什么..

【问题讨论】:

    标签: javascript angular http firebase firebase-realtime-database


    【解决方案1】:

    如果您想向某个位置添加新项目,您应该使用POST 而不是PUT

    this.http.post(this.url + 'data.json', datas, headers)...
    

    如果您只想通过提供部分数据来更新现有项目,您应该使用PATCH 而不是PUT。如果您的 HTTP 客户端不支持发送PATCH,您可以使用GET 并在X-HTTP-Method-Override 标头中指定PATCH

    有关所有这些的完整详细信息,请阅读Firebase documentation in saving data using the REST API

    【讨论】:

    • 不是添加item,是更新item的投票数。
    • 在这种情况下,您想使用PATCH,它(如the documentation 所说)用于“更新定义路径的一些键而不替换所有数据”。
    • 抱歉耽搁了,这几天我没能解决这个问题。感谢您的回答,我看到了这个文档,但我想找到一个使用 javascript 的示例。
    【解决方案2】:

    要更新您的数据,您需要知道要放入您的网址的特定项目的密钥;例如:your-firebase-url/.../L3-bvgdsggdgde。像这样的

    updateData (data:any): Observable<any> {
    
            updateUrl = this.url + 'L3-bvgdsggdgde';
    
            let datas = JSON.stringify(data);
            const headers = { 'Authorization': 'secret' };
    
            return this.http.put(updateUrl + 'data.json', datas, headers)
                .catch((e) => {
                    console.log(e);
                })
                .finally(() => {
                    console.log('finally');
                })
        }
    

    那么,如何从 Firebase 中获取密钥并重用它?当您从 Firebase 获取数据时关注此 Firebase doc

    constructor(afDb: AngularFireDatabase) {
      afDb.list('items').snapshotChanges().map(actions => {
        return actions.map(action => ({ key: action.key, ...action.payload.val() }));
      }).subscribe(items => {
        return items.map(item => item.key);
      });
    }
    

    您的对象将有一个关键属性,在您的 upvote/update 方法中重用它。

    【讨论】:

    • 非常感谢您的回答,抱歉耽搁了。我根据您的建议编辑了我的问题,但我没有成功将更新后的值存储在 db 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多