错误:Firestore已被初始化.您只能调用一次settings(),并且只能在调用Firestore对象上的任何其他方法之前 [英] Error: Firestore has already been initialized. You can only call settings() once, and only before calling any other methods on a Firestore object

查看:87
本文介绍了错误:Firestore已被初始化.您只能调用一次settings(),并且只能在调用Firestore对象上的任何其他方法之前的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我正在编写针对Firebase规则的测试,以便可以为我在stackoverflow上编写的另一个问题创建可重现的代码,并且出现此错误:

So I'm writing tests for firebase rules so I can create reproducible code for another question I'm writing on stackoverflow and I get this error:

$ mocha test2.js 


  Our social app
    1) Can read a single public post


  0 passing (245ms)
  1 failing

  1) Our social app
       Can read a single public post:
     Error: Firestore has already been initialized. You can only call settings() once, and only before calling any other methods on a Firestore object.
      at Firestore.settings (node_modules\@google-cloud\firestore\build\src\index.js:434:19)
      at getAdminFirestore (test2.js:41:9)
      at Context.<anonymous> (test2.js:60:23)
      at processImmediate (internal/timers.js:461:21)

似乎不喜欢我在getAdminFirestore函数中使用 admin.settings(dbSettings),但是如果我注释掉,它将抛出

It seems like it doesn't like that I use admin.settings(dbSettings) in the getAdminFirestore function but if I comment it out, then it throws

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (C:\Users\julien\Documents\GitHub\reloadium\test\test2.js)
      at listOnTimeout (internal/timers.js:554:17)
      at processTimers (internal/timers.js:497:7)

可能是因为这样找不到了仿真器端口?

Probably because then it doesn't find the emulator port?

test2.js

/* eslint-env mocha */
const firebase = require('@firebase/rules-unit-testing');
const firestoreEmulatorPort = 8081;
const dbSettings = { 
  host: `localhost:${firestoreEmulatorPort}`, 
  ssl: false,
}
const MY_PROJECT_ID = "test";
const theirId = "user_xyz";

function getFirestore(
  auth,
) {
  var db = firebase.initializeTestApp(
    {
      projectId: MY_PROJECT_ID,
      auth: auth
    }
  )
  .firestore()

  db.settings(
    dbSettings
  )
  

  return (
    db
  )
}

function getAdminFirestore(
) {
  var admin = firebase.initializeAdminApp(
    {
      projectId: MY_PROJECT_ID
    }
  )
  .firestore()

  admin.settings(
    dbSettings
  )

  return (
    admin
  )
}

describe(
  "Our social app", 
  (

  ) => {
    it(
      "Can read a single public post", 
      async (

      ) => {
        const admin = getAdminFirestore();

        const postId = "public_post"
        const setupDoc = admin.collection(
          "posts"
        ).doc(
          postId
        )

        await setupDoc.set(
          {
            authorId: theirId,
            visibility: "public"
          }
        )

        const db = getFirestore(null)

        const testRead= db.collection(
          "posts"
        ).doc(
          postId
        )

        await firebase.assertSucceeds(
          testRead.get()
        )
      }
    )
  }
)

firestore.rules

rules_version = '2';
service cloud.firestore {
  
  match /databases/{database}/documents {
    match /posts/{postId}{
      allow read:if (
        (
          resource.data.visibility == "public"
        ) || 
        (
          resource.data.authorId == request.auth.uid
        )
      );
    }
  }
}

我该如何解决?

推荐答案

我通过设置Firestore模拟器端口环境变量解决了我的问题 FIRESTORE_EMULATOR_HOST =本地主机:8081 而不是将端口设置为

I fixed my problem by setting the firestore emulator port environment variable FIRESTORE_EMULATOR_HOST=localhost:8081 instead of setting the port in

const firestoreEmulatorPort = 8081;
const dbSettings = { 
  host: `localhost:${firestoreEmulatorPort}`, 
  ssl: false,
}

db.settings(dbSettings)

我从代码中删除了它

这篇关于错误:Firestore已被初始化.您只能调用一次settings(),并且只能在调用Firestore对象上的任何其他方法之前的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆