Firebase 模拟器对本地 FireStore 的请求不成功

Posted

技术标签:

【中文标题】Firebase 模拟器对本地 FireStore 的请求不成功【英文标题】:Firebase Emulators Requests to local FireStore unsuccessful 【发布时间】:2020-12-18 14:58:05 【问题描述】:

你好,

我正在尝试设置 Firebase 模拟器,但我的应用仍在连接到 Firebase(web)。当我执行 db.collection("users").add() 时,我看到 https://console.firebase.google.com 上的条目不在 http://localhost:4000/firestore 上(主机端口是 8080,查看器端口是 4000)

这是我到目前为止所做的:

    Firebase 模拟器:开始返回“所有模拟器都准备好了!”

    Firebase.json 看起来不错(端口看起来不错)

"emulators": 
    "functions": 
      "port": 5001
    ,
    "firestore": 
      "port": 8080
    ,
    "database": 
      "port": 9000
    ,
    "hosting": 
      "port": 5000
    ,
    "pubsub": 
      "port": 8085
    ,
    "ui": 
      "enabled": true

    在初始化应用程序之前,我将 databaseURL 更改为我的本地 firestore。 请注意,在视频“The Local Firebase Emulator UI in 15 minutes”(https://www.youtube.com/watch?v=pkgvFNPdiEs 5:19)中,David East 将整个配置对象替换为“config = databaseURL: '...' ”,但它返回此错误: “未捕获的 FirebaseError:firebase.initializeApp 中未提供“projectId”,如果我添加 value-key projectId,它会返回丢失的其他错误。
if (location.hostname === "localhost") 
  config.databaseURL = "http://localhost:8080?ns=project_name";


firebase.initializeApp(config);
    Firebase 使用好项目 (Firebase Firestore works with real database but not emulator)
firebase use project_name
    我还创建了 Google Cloud Platform 私钥...以防万一。

我认为我的问题可能出在第 3 步,但我找不到解决方法。你有什么想法吗?你会怎么做才能让它发挥作用?

谢谢!

【问题讨论】:

@DougStevenson 感谢您纠正拼写错误。 我在观看同一个视频后遇到了完全相同的问题。 【参考方案1】:

您已经完成了大部分工作,但我认为连接到本地数据库模拟器的方法在制作视频后发生了变化。

我使用以下方法成功连接到本地数据库模拟器:

if (!firebase.apps.length) 
  let config = 
    apiKey: "-------------------",
    authDomain: "--------------",
    databaseURL: "------------------",
    projectId: "----------------",
    storageBucket: "---------------------",
    messagingSenderId: "--------------",
    appId: "----------------------",
    measurementId: "-----------------"
  ;

  firebase.initializeApp(config);

  if (location.hostname === "localhost") 
    var db = firebase.firestore();
    db.settings(
      host: "localhost:8080",
      ssl: false
    );
  

保留在线连接的原始配置,但如果 location.hostname === "localhost",则进行适当的更改。

firebase.initializeApp(config) 需要在检测应用本地运行的 if 语句之上。

好在app继续使用在线认证,数据库和函数连接都是本地的。

最新文档在这里:https://firebase.google.com/docs/emulator-suite/connect_and_prototype

【讨论】:

以上是关于Firebase 模拟器对本地 FireStore 的请求不成功的主要内容,如果未能解决你的问题,请参考以下文章

Firestore/Firebase 模拟器未运行

Firebase Firestore 模拟器错误`主机已在 settings() 和 useEmulator() 中设置,将使用模拟器主机`

Firebase Firestore:无法访问Firestore后端(仅限Android)

React Native Firebase Cloud Firestore

Flutter 错误:找不到符号导入 com.google.firebase.firestore.LoadBundleTaskProgress;

在 Jest 中模拟 Firebase 管理员时出错:“TypeError:admin.firestore 不是函数”