我有一个类似于堆栈溢出的网站,用户可以在其中上下投票。我的问题是如何在Vuejs / Firestore / VUEX架构下将这些信息有效地保存到firestore?像stackoverflow / reddit这样的其他站点如何处理呢?
我不想直接保存点击,因为Firestore会按笔数收费,并且用户连续多次多次上下投票非常容易。我还具有许多会触发的云功能,每个功能都需要一些时间才能完成。
我看到了几种选择。一旦进行投票,我可以将计时器间隔设置为2秒,如果该时间没有变化,则将其提交到Firestore。当用户离开页面太快并且测试了一些较大的网站后,这种方法的缺点是无法正常工作。
另一种替代方法是使用VUEX保存页面刷新/退出。尽管我为此找到的解决方案似乎依赖于使用 window 对象,但是当我在自己的应用中实现SSR时,我听说它可能无法很好地工作。
也许为此有一个内置的解决方案?
答案 0 :(得分:1)
保护后端免受恶意用户攻击的一种常见方法是在某些事件上添加速率限制。您的情况是向上/向下投票事件。
您的第一种方法
您提到的非常接近速率限制的工作方式。只需单击用户并在 之后2秒将事件触发到存储区域,并且没有任何更改,您还可以立即触发事件,然后阻止任何事件2秒钟。这样,用户可以在2秒钟内离开页面,并且向上/向下投票仍将保留在您的数据库中。
您的第二种方法
这实际上是我从未尝试过的方法,只是因为您已经提到与SSR结合出现的潜在问题,以及将其保存到临时本地状态的复杂性使我认为这种方法可能不值得工作。
完善的解决方案
我从github问题评论中复制了此内容,请参阅jsfiddle作为示例:
您可以使用“规则”为每个用户的速率限制提供解决方案
link to fiddle
http://jsfiddle.net/firebase/VBmA
我们已经讨论过公开这些信息,但是目前我们不公开配额,速率限制或计费指标。可能有一些比“规则”(主要用于authN / Z,资源定义,类型验证)更好的方法来配置这些内容。暴露它们的担忧在于,大量的不同配置文件(firestore.quota,firestore.billing,firestore.rules等)激增了用户的不必要的困惑。
问题: https://github.com/firebase/firebase-js-sdk/issues/647#issuecomment-380303400