javascript - 如何在 Web 上保存 Firestore 数据库请求以减少调用次数
问题描述
我有一个包含我所有产品的产品页面,每次有人按 F5 时它都会被执行。我想保存所有产品,但是当添加产品时,它可以更新一次以减少所有 api 调用。
- 我试图将它保存在 Cookie 中,但这不是一个好方法。
我尝试使用 Http 缓存控制来做到这一点,但它不起作用(如何使用 Http 缓存控制保存 Firestore 请求?)
我尝试了 localstorage,但添加新产品时它没有执行。
//JS 文件 我的 cookie 尝试:它有效,我每 0.5 天只收到一个 api 调用,但如果我的产品发生更新,我只能在以后得到
//if cookie === undifined
const firestore = firebase.firestore()
firestore.doc("products/phones").onSnapshot(function (doc) {
if (doc && doc.exists) {
const products = doc.data().produc
//Save doc.data().produc in cookie 0.5 day expirery
}
})
我想保存我的 Firestore 请求客户端,并且只在需要更新产品列表时发出 Firestore 请求。
解决方案
你的第二种方法没有工作的机会。该firebase.json
文件由 Firebase 托管使用,与 Cloud Firestore 完全无关。
尽管您没有包含实际确定何时附加onSnapshot
侦听器的代码,但您的第一种方法可能会起作用。但正如您所发现的,每天最多附加两次侦听器意味着您每天最多只能获得两次更新,同时您可能正在提供陈旧的数据。
听起来您必须在提供新数据和减少服务器调用之间做出选择。这是一个相当普遍的权衡。
不过,还有其他一些方法可以减少服务器最新数据所需的文档读取次数:
- 在每个文档中包含数据更新时的时间戳,然后使用查询仅请求新数据。您将在本地存储中保留上次请求/获取数据的时间戳,并在每次查询中使用该时间戳。
- 将最近更新的数据聚合到一个或几个文档中,这样您就必须阅读更少的文档。
推荐阅读
- bash - 检查 bash 脚本中未设置的变量不起作用
- javascript - 在 IIFE 中循环 setTimeout 而不是不使用 var 作为迭代变量
- html - 为什么我的 CSS 或 Sass 转换不起作用?
- ansible - 如果操作系统版本与清单中的不同,如何停止执行角色
- reactjs - 对象作为 React 子级无效 - React Hooks
- python - 使用两个函数引发异常未按预期捕获异常
- c# - 表单未在 Visual Studio 2019 中呈现
- javascript - 如何使用 Cypress 测试“HOVER”(.trigger('mouseover') 不起作用)
- reactjs - Hooks & Context & (State / Reducer) 的代码结构/模式
- email - 使用亚马逊 SES 交换电子邮件发送给自己的组织的权限