Javascript 获得;FirebaseError:缺少或权限不足“;如果我在firestore上设置ignoreUndefinedProperties设置

Javascript 获得;FirebaseError:缺少或权限不足“;如果我在firestore上设置ignoreUndefinedProperties设置,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我试图在firestore上设置ignoreUndefinedProperties标志,因为我经常保存一些嵌套很深的对象,这些对象有很多可选字段,这些字段可能是未定义的。设置了该标志后,无论何时调用firestore,我都会从Firebase收到此错误: FirebaseError: Missing or insufficient permissions. at new Nr (http://localhost:5000/__/firebase/8.0.1/firebase-firest

我试图在firestore上设置ignoreUndefinedProperties标志,因为我经常保存一些嵌套很深的对象,这些对象有很多可选字段,这些字段可能是未定义的。设置了该标志后,无论何时调用firestore,我都会从Firebase收到此错误:

FirebaseError: Missing or insufficient permissions.
    at new Nr (http://localhost:5000/__/firebase/8.0.1/firebase-firestore.js:1:45522)
    at http://localhost:5000/__/firebase/8.0.1/firebase-firestore.js:1:169449
    at cf.onMessage (http://localhost:5000/__/firebase/8.0.1/firebase-firestore.js:1:170279)
    at http://localhost:5000/__/firebase/8.0.1/firebase-firestore.js:1:168331
    at http://localhost:5000/__/firebase/8.0.1/firebase-firestore.js:1:168736
    at http://localhost:5000/__/firebase/8.0.1/firebase-firestore.js:1:113756
如果我只注释掉设置该标志的代码,那么一切正常。我认为问题可能是我试图在设置标志之前访问firestore,因此我尝试在引导应用程序之前将此代码放入main.ts文件:

import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { AppModule } from './app/app.module';
import { environment } from './environments/environment';

declare var firebase: any;

if (environment.production) {
  enableProdMode();
}

// init firebase before anything else calls it
firebase.firestore().settings({
  ignoreUndefinedProperties: true
});

platformBrowserDynamic().bootstrapModule(AppModule)
  .catch(err => console.log(err));
对于某些背景,我正在制作一个Angular web应用程序,该应用程序将托管在Firebase Hosting上,因此我没有权限修改用于设置所有Firebase库的初始化脚本,根据此处的说明,我让Hosting init.js脚本处理初始化我的所有Firebase应用程序:

因此,在我的index.html中,我有:

 <!-- Firebase App (the core Firebase SDK) is always required and must be listed first -->
      <script src="/__/firebase/8.0.1/firebase-app.js"></script>

      <!-- Add Firebase products that you want to use -->
      <script src="/__/firebase/8.0.1/firebase-auth.js"></script>
      <script src="/__/firebase/8.0.1/firebase-firestore.js"></script>
      <script src="/__/firebase/8.0.1/firebase-functions.js"></script>
      <script src="/__/firebase/8.0.1/firebase-storage.js"></script>

      <!-- Initialize Firebase (since using firebase hosting no need for config object) -->
      <script src="/__/firebase/init.js?useEmulator=true"></script>


有关如何将此标志设置为true的任何想法?

要使用忽略未定义属性设置,请执行以下步骤:

  • 导入firebase管理sdk(在Typescript中):
  • 设置设置如下:

  • 您是否尝试更改读写权限:如果设置为false,请将其更改为true。可以在以下内部执行此操作:数据库-->规则?注意:这样做的缺点是,您的安全性实际上被禁用了。请您指出初始化firebase变量的位置好吗?您是如何做到的?正如问题中提到的,我正在使用Firebase主机,因此提供的init.js脚本正在进行初始化。请查看并重新检查您是否正在初始化。您是否也可以分享规则并解释是哪一行导致angular应用程序出现问题?这不适用。我正在使用firebase托管,因此我正在导入index.html中的所有库,firebase托管中的init.js脚本正在处理初始化。我知道您正在使用firebase托管,但我无法在中看到此设置。根据,此设置适用于Cloud Firestore,因此您在应用程序中应该调用Firestore客户端并设置ignoreUndefinedProperties设置。@AlexEgli she是对的。您需要在代码中设置该选项。你使用的主机并不重要,因为你的angular应用程序将被打包。查看此文档,该文档解释了在使用模块绑定器(如webpack)时如何添加依赖项。是的,已确认,如果要设置配置属性,firebase hosting无法支持处理初始化。我更愿意让宿主管理初始化,因为它也处理特定于环境的配置,所以我只是修改了代码,对保存到firestore的任何文档中的任何字段进行未定义的检查。
    import * as firestore from "firebase-admin";
    
    const db = firestore.firestore();
    db.settings({ ignoreUndefinedProperties: true })