无法取消订阅实时更新:onSnapshot中未捕获的错误:错误:缺少权限或权限不足

时间:2018-08-22 21:38:29

标签: javascript firebase google-cloud-firestore

使用Firestore的onSnapshot方法取消订阅更新时遇到了一些麻烦。

我与外部工作人员对文件进行了一些处理。完成后,它将更新Firestore数据库。我使用以下代码在前端收听这些更新:

import store from "../store";
import db from "./firebase"
import { updateModelConversionProgress } from "../actions/updateModelConversionProgress";

const listenForConversions = (resource, id) => {
  const modelRef = db.collection(resource).doc(id);
  const unsubscribe = db.collection(resource).doc(id).onSnapshot(() => {});
  modelRef.onSnapshot(doc => {
    const model = doc.data();
    if (model) {
      store.dispatch(
        updateModelConversionProgress(
          id,
          model.file.uniqueFilename,
          model.conversionStatus
        )
      );
    }
    if (model && model.conversionStatus === "completed") {
      // Unsubscribe from updates
      unsubscribe();
    }
  });
};

export default listenForConversions;

这一切都很好,更新数据库时我的UI也随之更新。但是,如果我删除该文件,则会在控制台中收到以下错误:Uncaught Error in onSnapshot: Error: Missing or insufficient permissions

我认为这与以下事实有关:文档已被删除,因此用户不再有权访问它(我有安全规则,仅允许用户访问具有其userID的文档),因此Missing or insufficient permissions part。无论如何,UI不应再监听更新,这使我想知道为什么会收到此错误消息?我尝试使用相同的文档引用(即const unsubscribe = modelRef.onSnapshot(() => {});)传递一个空的回调,但随后我只收到两次错误消息。无论如何,documentation implies我应该使用其他文档引用。我很确定自己没有正确取消订阅,但是不确定要更改什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您所看到的错误是故意的。仅在明确允许的情况下,您才能查看数据。由于没有数据可用于执行规则,因此未明确给出权限,因此会出现错误。

如果您不想在控制台上看到该错误或冒泡,可以随时传递一个onError函数来处理该特定错误。