问题描述
所以我正在编写针对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 variableFIRESTORE_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对象上的任何其他方法之前的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!