实时数据库。当我发送日期为 0(仅数字 0)的 put 请求时,出现错误。其他号码也可以

问题描述 投票:0回答:1

有Firebase实时数据库,网站上已经实现了动漫点赞功能。问题来自于删除点赞,它是这样实现的:发出 get 请求,响应包含当前的点赞数,然后发送 put 请求,将 get 请求的响应设置为减 1。

此外,用户有关这部动漫的信息也会从他的数据中删除,但这并不是那么重要。

async unlikeAnime(userID, likeID, animeID) {
    const likeCount = await firebase.get(`AnimeList/${animeID}/like.json`);
    firebase.put(`AnimeList/${animeID}/like.json`, parseInt(likeCount.data - 1));
    firebase.delete(`Users/${userID}/likedAnime/${likeID}.json`);
}

除了 0 之外的任何数字都可以正常工作。如果一个新的动漫被添加到网站(它在数据库中显示为 0 个喜欢),然后用户喜欢它(向数据库发送 1),然后将其删除(发送0到数据库),那么数据库就会报错,不会删除like。

我检查了是否在所有情况下都发送了相同类型的数据(是的,一个数字),检查了当有 1 个 like 时是否从 get 请求收到了正确的响应(是的,likeCount.date 返回 1 并发送 0) 。我什至写了 ParseInt 以防万一,但它没有帮助。

get请求和delete请求100%完美工作,问题只出在put上并且只有当数据等于数字0时。它根本无法在数据库中设置数字0并返回错误。

我检查了请求的质量,它正在正确创建。该链接完全有效且正确。我还将附上数据库的链接。

创建时有 0 个赞,然后用户点了 1 个赞并将其删除,再次设置为 0。然后出现错误。

javascript ajax firebase-realtime-database axios web-development-server
1个回答
0
投票

如果没有看到实际的响应正文 (

error.response.data
),很难准确说出问题是什么,但是使用 服务器值可以更轻松地实现您想要完成的任务。

读取值、递减值并将新值发送回数据库不是原子操作,可能会导致竞争条件。相反,告诉服务器为您减少该值

firebase.put(`AnimeList/${animeID}/like.json`, { '.sv': { increment: -1 } });
© www.soinside.com 2019 - 2024. All rights reserved.