【问题标题】:Firestore INTERNAL ASSERTION FAILED: Got result for empty write pipelineFirestore 内部断言失败:得到空写入管道的结果
【发布时间】:2019-03-05 21:18:38
【问题描述】:

我在 Javascript(网络)上使用 Firebase-Firestore 和渐进式网络应用程序。我遇到了这个错误:

INTERNAL ASSERTION FAILED: Got result for empty write pipeline

由于 Firebase 与 XHR 请求异步运行,因此很难确定错误的确切来源 - 似乎任何 onSnapshotsetupdate 都在为我抛出此错误。

在第一个错误之后出现了一系列其他错误:

INTERNAL ASSERTION FAILED: AsyncQueue is already failed: Error: FIRESTORE (5.3.0) INTERNAL ASSERTION FAILED: Got result for empty write pipeline

我认为我的操作很正常 - 只是在它发生时使用 API set(), update() , onSnapshot() 函数。

这不是一个关键任务错误 - 代码运行良好,但是当我打开调试时遇到了几千个错误,所以在这方面它是禁止的。

对于我的 PWA,我使用的是缓存优先、网络更新模型,它返回 cachedResponse,但也返回 fetch()es 响应并缓存获取的响应。

有人有什么见解吗?

【问题讨论】:

  • 附加信息:我正在使用渐进式 Web 应用服务工作者。当我关闭缓存并让它只进入网络时,代码工作正常!我认为 serviceWorker 正在干扰调用。
  • @FrankvanPuffelen 已编辑 - 你能再读一遍吗?由于我上面提到的问题,我仍然无法真正放下确切的代码行。解决了这个问题后,我认为这与我将获得的可重复性一样接近,而不会在问题中给出答案。
  • 这是一个失败的内部断言,这不应该发生。你能分享完整的堆栈跟踪吗?
  • 如果您因为是 firebase 开发人员之一而对此感到担忧,没关系,我已经解决了。问题是我的 PWA 代码干扰了 firebase 发出的 CORS 请求。下面看看我的回答~
  • 我很担心,因为这是一个失败的内部断言,它永远不会发生。但是为了更好地理解原因,我们需要查看完整的堆栈跟踪。

标签: javascript firebase google-cloud-firestore progressive-web-apps


【解决方案1】:

这就是 PWA!使用 PWA,我捕获了所有 GET 请求,包括 Firebase 自己的 GET 请求。过滤以确保 CORS 请求不会从缓存返回解决了该问题。

为了解决这个问题,我将这段代码添加到我的 PWA 中:

self.addEventListener("fetch", event => {
    if (event.request.method == "GET") {
      event.respondWith(
        (async function() {
          const cachedResponse = await cache.match(event.request, {
            ignoreSearch: true
          });
          // Returned the cached response if we have one, otherwise return the network response.
          if (cachedResponse && event.request.type!="cors") {
            //AVOID CORS FOR THINGS LIKE FIREBASE
            updateCache(event);
            return cachedResponse;
          } else return await updateCache(event);
        })()
      );
    } else {
      event.respondWith(fetch(event.request));
    }
  });

如果您是 PWA 领域的新手,想要快速开始任何 PWA 项目,或者只想“分享笔记”,这里有包含完整 PWA 文件的 repo:https://github.com/acenturyandabit/genUI/blob/master/Javascript/pwa.js

我个人在这方面投入了很多时间,希望对您有所帮助:)

【讨论】:

  • 为了更清楚一点,您不应该缓存 Firestore 请求,因为它们都是唯一的。而且您绝对不应该使用ignoreSearch: true,因为这意味着您在检查缓存时会忽略请求中的查询字符串,因此我们发送的每个请求最终都会从您的缓存中返回相同的(错误的)数据。这就是您在 SDK 中遇到错误的原因。过滤掉 CORS 请求是一个足够的解决方案,但只缓存对您的源(或其他被认为安全的源)发出的请求可能更干净,例如if (event.request.url.startsWith(self.location.origin)) {
  • 我使用 ignoreSearc:true 以便我的基于前端查询字符串的处理程序可以知道要从我的 IndexedDB 中加载哪些文件哈哈哈,但是很好。 ignoreSearch 也有一个小故障,每次请求将 TTFB 移回 2 秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
相关资源
最近更新 更多