firebase 为什么在使用npm测试firestore规则时会出现错误“connect ECONNREFUSED 127.0.0.1:8080

jchrr9hc  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(174)

我想测试一个firestore规则。下面是firestore.rules。我想检查这些安全规则是否有效。然后我尝试使用jest和firebase测试。但是,当执行“npm测试”时,出现错误“连接ECONFREFUSED 127.0.0.1:8080”。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /clubUsers/{uid} {
      allow read: if request.auth != null
        && request.auth.uid == uid;
      allow create: if request.auth != null
        && request.auth.uid == uid;   
      allow update: if request.auth != null
        && request.auth.uid == uid;  
    }
  }
}

我的测试脚本在这里。

const firebase = require('@firebase/testing/');
const fs = require('fs');

const project_id = "PROJECT ID";

describe("testing firestore rules", () => {

    beforeAll(
        async () => {
            await firebase.loadFirestoreRules({
                projectId: project_id,
                rules: fs.readFileSync('../../firestore.rules', 'utf8'),
            });
        }
    );

    afterEach(
        async () => {
            await firebase.clearFirestoreData({ projectId: project_id });
        }
    );

    afterAll(
        async () => {
            await Promise.all(
                firebase.apps().map((app) => app.delete())
            );
        }
    );

    function authedApp(auth) {
        return firebase.initializeTestApp({
            projectId: project_id,
            auth: auth,
        }).firestore();
    }

    describe("testing get and write", () => {

        test("testing get", async () => {
            const db = authedApp({ uid: 'UID' });
            const message = db.collection("clubUsers").doc("UID");
            await firebase.assertSucceeds(message.get());
        })

        test("testing write", async () => {
            const db = authedApp({ uid: "UID" });
            const message = db.collection("clubUsers").doc("UID");
            await firebase.assertSucceeds(
                message.set({ text: "hoge" })
            );
        })
    })

})

我尝试了测试,而firebase模拟器是打开的。
我通过在终端上执行sudo lsof -P -i:8080检查了什么正在使用端口8080。但是,没有任何东西使用端口8080。

ttygqcqt

ttygqcqt1#

今天也遇到了这个问题......几个源代码(GitHubhere)提供了一个解决方案。这是一个调用firebase.clearFirestoreData()的问题,当模拟器在默认的host:port上找不到时就会发生。
解决方案建议设置环境变量以定义适用于您的设置的主机和端口。例如:

process.env.FIRESTORE_EMULATOR_HOST = '127.0.0.1:5002';

使用firebase emulators:start启动模拟器后,您可以找到要使用的正确的host:port组合
这个问题已经在新的模块化v9 JS SDK中得到了解决,但是需要对新的API进行一些重构(如docs中所定义的)。现在,您可以在初始化时指定hostport

testEnv = await initializeTestEnvironment({
    projectId: projectId,
    firestore: {
        host: '127.0.0.1',
        port: 5002,
    }
});

PS.不要像我一样被愚弄,以为127.0.0.1和localhost总是一样的!

相关问题