axios 实时数据库,当我发送一个日期为0的put请求时(只有数字0),我会得到一个错误,其他数字也可以

cl25kdpy  于 11个月前  发布在  iOS
关注(0)|答案(1)|浏览(149)

有一个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个喜欢),然后用户喜欢它(发送1到数据库),然后删除它(发送0到数据库),那么数据库将给予错误,不会删除喜欢。


的数据



我检查了是否在所有情况下都发送了相同类型的数据(是的,一个数字),检查了当有1个类似的请求时是否从get请求中收到了正确的响应(是的,likeCount.date返回1,发送0)。
get请求和delete请求100%完美地工作,问题只在put中,并且只有当数据等于数字0时。它根本无法在数据库中设置数字0并返回错误。
我检查了请求的质量,它正在正确创建.链接是完全工作和正确.我也会附上一个链接到数据库的样子.

它是用0个喜欢创建的,然后用户放1个喜欢并删除它,再次设置为0。


wswtfjt7

wswtfjt71#

错误:“未提供数据。”
我怀疑这是由请求体和Content-Type: application/x-www-form-urlencoded头中的文字0引起的。您可能可以通过强制执行Content-Type: application/json来解决它,但有一个更好的方法...
使用服务器值可以更容易地实现您尝试完成的任务。
您可以使用占位符值在某个位置写入服务器值,占位符值是一个带有单个.sv对象。该键的值是您希望设置的服务器值类型。
阅读值,递减它并将新值发送回数据库不是原子的,可能会导致竞争条件。相反,使用负increment server-value告诉服务器为您递减值。

firebase.put(`AnimeList/${animeID}/like.json`, { '.sv': { increment: -1 } });

字符串
有关执行原子服务器端数据操作的更多详细信息,请参见原子服务器端增量。

相关问题