【问题标题】:In local Firebase, how do I set a projectId for the current environment?在本地 Firebase 中,如何为当前环境设置 projectId?
【发布时间】:2020-08-26 07:20:37
【问题描述】:

我正在尝试将一些测试数据写入本地版本的 Firebase。我在 .env.local(和 .env.development 文件)中定义了这些变量...

REACT_APP_MB_ACCESS_TOKEN="accesstoken"
ALGOLIA_APP_ID="appid"
ALGOLIA_API_KEY="apikey"
NODE_ENV="development"
FIREBASE_EMULATOR_HOST_VAR=localhost:9000
FIRESTORE_EMULATOR_HOST=localhost:8080
GCLOUD_PROJECT=mutualaid-123f6

我有以下设置(通过 npm run dev:upload)将虚拟数据上传到我的本地 Firebase ...

const admin = require("firebase-admin");

const data = require("./data.json");
let serviceAccount = process.env.FIREBASE_SECRET;
...

  require("dotenv").config();
  admin.initializeApp();
  db = admin.firestore();
...

async function upload(data, path) {
  console.log("starting ...");
  return await db
    .doc(path.join("/"))
    .set(data)
    .then(() => console.log(`Document ${path.join("/")} uploaded.`))
    .catch((e) => {
      console.error(`Could not write document ${path.join("/")}.`);
      console.log(e);
    });

S

以上结果

...
Could not write document organizations/1/missions/aaf3c03c33ecf79e3d7ffddf401c01f0.
Error: Unable to detect a Project Id in the current environment. 
To learn more about authentication and Google APIs, visit: 
https://cloud.google.com/docs/authentication/getting-started
    at /Users/davea/Documents/workspace/resilience-app/node_modules/google-auth-library/build/src/auth/googleauth.js:89:31
    at processTicksAndRejections (internal/process/task_queues.js:97:5)

f

或我的 data.json 文件中的所有数据(示例如下)。我还需要配置什么才能将此数据导入本地 Firebase?

{
  "organizations": {
    "1": {
      "missions": {
        "aaf3c03c33ecf79e3d7ffddf401c01f0": {
          "status": "started",
          "missionDetails": {
            "dummy": "This is only here because upload modules did not understand that we want this to be a field",
            "needs": [
              {
                "name": "Fruits & Veggies Medley",
                "quantity": 1
              }
            ]
          },
          "uid": "aaf3c03c33ecf79e3d7ffddf401c01f0",
          "deliveryConfirmationImage": "",
          "feedbackNotes": "",
          "groupUid": "Daly City 2020/03/05",
          "organizationUid": "1",
          "volunteerDisplayName": "Michael Williams",
          "deliveryWindow": {
            "timeWindowType": "as soon as possible",
            "startTime": "06/03/2020, 10:40:57"
          },

【问题讨论】:

    标签: reactjs firebase npm google-cloud-firestore google-authentication


    【解决方案1】:

    你还没有将你的配置对象传递给admin.initializeApp

    由于您使用 dotenv 加载 env 文件,您可以创建一个带有 env 详细信息的配置对象,例如

    const config = {
        type: "service_account",
        project_id: "xxx",
        credential: 'your credentials'
    };
    
    require("dotenv").config();
      admin.initializeApp({config});
      db = admin.firestore();
    

    如果您没有将任何配置传递给 initializeApp,那么您需要定义它的 FIREBASE_CONFIG 环境对象。

    根据documentation

    SDK 也可以不带参数初始化。在这种情况下, SDK 使用 Google Application Default Credentials 并从 FIREBASE_CONFIG 环境变量。如果内容 FIREBASE_CONFIG 变量以 { 开头,它将被解析为 JSON 目的。否则 SDK 假定该字符串是 包含选项的 JSON 文件。

    【讨论】:

      【解决方案2】:

      看起来您可能缺少process.env.FIREBASE_SECRET(除非您故意不包含它,因为它是私钥)。我还应该指出,.env* 文件不适合存储私钥,因为它们捆绑在您的应用程序代码中并且可以公开访问。

      您可以通过多种方式初始化管理 SDK。它们在Add the Firebase Admin SDK to your server 参考指南中进行了概述。看起来您正试图在没有参数的情况下初始化 SDK,这在 here 中有所介绍。基本上,您需要设置一个名为FIREBASE_CONFIG 的环境变量(通过终端中的export,而不是.env 文件),它是包含配置信息的JSON 文件的路径,或者是包含配置信息的JSON 对象.

      祝你好运!

      【讨论】:

      • 嗨@beardo,我的印象是你可以在本地运行 Firebase 而无需指定 process.env.FIREBASE_SECRET 。无论如何,这就是我的意图。让我知道是否还有其他事情需要我做才能让 Firebase 不再寻找它。
      猜你喜欢
      • 2017-11-29
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      相关资源
      最近更新 更多