代码之家  ›  专栏  ›  技术社区  ›  Surion

实时数据库。当我发送日期为0(只是数字0)的看跌请求时,我会收到一个错误。其他数字有效

  •  0
  • Surion  · 技术社区  · 2 年前

    有一个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个赞)。那么该数据库将给出一个错误,并且不会删除该赞。

    enter image description here

    enter image description here

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

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

    我检查了请求的质量,它是正确创建的。链接完全正常工作且正确。我还将附上一个数据库的链接。 enter image description here

    它是用0个赞创建的,然后用户放置1个赞并删除它,再次设置0。一个错误来了。

    enter image description here

    1 回复  |  直到 2 年前
        1
  •  1
  •   Phil    2 年前

    错误:“未提供任何数据。”

    我怀疑这是由字面意思引起的 0 在请求主体和 Content-Type: application/x-www-form-urlencoded 头球你也许可以通过强制执行来解决这个问题 Content-Type: application/json 但还有更好的方法。。。

    使用 server value .

    可以使用占位符值在某个位置写入服务器值,占位符值是 具有单个的对象 .sv 钥匙 。该键的值是您希望设置的服务器值的类型。

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

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

    另请参阅 Atomic server-side increments 有关执行原子服务器端数据操作的更多详细信息。