如何解决错误:Firestore 已初始化您只能调用 settings() 一次,并且只能在调用 Firestore 对象上的任何其他方法之前
所以我正在为 firebase 规则编写测试,以便我可以为我在 stackoverflow 上编写的另一个问题创建可重现的代码,但我收到此错误:
$ 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)
但如果我将其注释掉,它就会抛出
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)
可能是因为它没有找到模拟器端口?
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=localhost:8081
而不是在
const firestoreEmulatorPort = 8081;
const dbSettings = {
host: `localhost:${firestoreEmulatorPort}`,ssl: false,}
db.settings(dbSettings)
我从我的代码中删除了这个
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。