警告,FIREBASE_CONFIG缺少环境变量.初始化 firebase-admin 将失败



当我关注火力基地的文档时,但我无法连接到火力基地。

有人面临这个问题吗?

  • https://firebase.google.com/docs/firestore/quickstart

  • https://firebase.google.com/docs/firestore/manage-data/add-data

我的代码 :

  • index.js

    var admin = require("firebase-admin");
    var serviceAccount = require("./key/serviceAccountKey.json");
    admin.initializeApp({
        credential: admin.credential.cert(serviceAccount),
        databaseURL: "https://sampleLink.firebaseio.com",
    });
    const functions = require("firebase-functions");
    var db = admin.firestore();
    var data = {
        name: "Los Angeles",
        state: "CA",
        country: "USA",
    };
    // Add a new document in collection "cities" with ID 'LA'
    var setDoc = db.collection("cities").doc("LA").set(data);
    setDoc;
    
  • package.json

    {
    "name": "functions",
    "description": "Cloud Functions for Firebase",
    "scripts": {
        "serve": "firebase serve --only functions",
        "shell": "firebase functions:shell",
        "start": "npm run shell",
        "deploy": "firebase deploy --only functions",
        "logs": "firebase functions:log"
    },
    "dependencies": {
        "firebase": "^5.7.3",
        "firebase-admin": "~6.0.0",
        "firebase-functions": "^2.1.0"
    },
    "private": true
    }
    
  • console

    tktktk:functions dev$ node index.js
    Warning, FIREBASE_CONFIG environment variable is missing. Initializing firebase-admin will fail
    The behavior for Date objects stored in Firestore is going to change
    AND YOUR APP MAY BREAK.
    To hide this warning and ensure your app does not break, you need to add the
    following code to your app before calling any other Cloud Firestore methods:
    const firestore = new Firestore();
    const settings = {/* your settings... */ timestampsInSnapshots: true};
    firestore.settings(settings);
    With this change, timestamps stored in Cloud Firestore will be read back as
    Firebase Timestamp objects instead of as system Date objects. So you will also
    need to update code expecting a Date to instead expect a Timestamp. For example:
    // Old:
    const date = snapshot.get('created_at');
    // New:
    const timestamp = snapshot.get('created_at');
    const date = timestamp.toDate();
    Please audit all existing usages of Date when you enable the new behavior. In a
    future release, the behavior will change to the new behavior, so if you do not
    follow these steps, YOUR APP MAY BREAK.
    

我的环境如下:

$ firebase --version
6.3.0
$ node -v
v8.12.0
$ npm -v
6.4.1

FIREBASE_CONFIG警告暗示通往JSON的路径缺失(或错误)。

要么根据需要设置FIREBASE_CONFIG - 要么将GOOGLE_APPLICATION_CREDENTIALS设置为环境变量然后运行gcloud auth application-default login;然后您可以使用admin.credential.applicationDefault()而不是admin.credential.cert(serviceAccount)

在本地运行云函数的正确方法是通过 Functions shell(参见 https://firebase.google.com/docs/functions/local-emulator)。如果你想像 $ node index.js 一样直接运行它,那么你必须自己设置所需的环境变量,否则firebase-functions会抱怨。

但是,请注意,上述消息只是一个警告。尽管如此,您的代码仍在运行。如果您没有看到任何写入 Firestore 的数据,那可能是因为您没有处理 Firestore set() 方法返回的承诺。

对我来说

,问题是那行:

const functions = require('firebase-functions');

我刚刚从索引中删除了它.js。我不再使用Firebase Cloud Function,但我忘了删除那行。这就是我的问题来源。

所以也许你也把这个包导入到一个不需要它的文件中。

我遇到了完全相同的问题。原来它与节点版本10有关我删除了节点 10 并回到节点 8,一切都像魅力一样工作......

 const functions = require('firebase-functions');
 const admin = require('firebase-admin');
 admin.initializeApp();

刚刚命中

 firebase deploy --only functions

在节点 v8 中。

关于你的问题,刚才多亏了你的代码,我能够解决我的问题。

我做什么:

const admin = require('firebase-admin');
var serviceAccount = require("./serviceAccount.json");
admin.initializeApp({ credential: admin.credential.cert(serviceAccount) });
const db = admin.firestore();

我使用的是云 Firestore 数据库,而不是实时数据库,所以我不会在初始化应用程序中发送第二个参数,我只是将数据库的配置放在环境文件中。

export const environment = {
  production: false,
  firebaseConfig : {
    apiKey: 'XXXXXXXXXXX',
    authDomain: 'XXXXXXXXXX',
    databaseURL: 'XXXXXXXXXX',
    projectId: 'XXXXXXXXX',
    storageBucket: 'XXXXXXXXXXX',
    messagingSenderId: 'XXXXXXXXXXX',
    appId: 'XXXXXXXXXXXX',
    measurementId: 'XXXXXXX'
  }
};

这对我有用:

admin.initializeApp({
  credential: admin.credential.cert({
      "type": "service_account",
      "project_id": "took from Firebase Generated Private Key",
      "private_key_id": "took from Firebase Generated Private Key",
      "private_key": "took from Firebase Generated Private Key",
      "client_email": "took from Firebase Generated Private Key",
      "client_id": "took from Firebase Generated Private Key",
      "auth_uri": "took from Firebase Generated Private Key",
      "token_uri": "took from Firebase Generated Private Key",
      "auth_provider_x509_cert_url": "took from Firebase Generated Private Key",
      "client_x509_cert_url": "took from Firebase Generated Private Key"
  }),
  databaseURL: "https://test-dia.firebaseio.com"
});

从 2021 年开始删除警告的正确方法是将firebase-functions-test添加到您的开发依赖项中,并在您的开玩笑配置中调用它,如下所示:

// jest.preset.js
const test = require('firebase-functions-test')();
// ...

在此处阅读有关在"离线模式"下进行测试的更多信息:https://firebase.google.com/docs/functions/unit-testing#offline-mode

如果您

尝试在本地运行云功能并希望使用云身份验证和数据库,例如。

步骤:1 - 转到 Firebase 控制台并将凭据数据复制为 JSON,例如:

{
      "apiKey": "<YOUR-API-KEY>",
      "authDomain": "<YOUR-authDomain>",
      "databaseURL": "<YOUR-databaseURL>",
      "projectId": "...",
      "storageBucket": "...",
      "messagingSenderId": "...",
      "appId": "..."
}

2 - 在项目文件夹中,将其另存为 JSON 文件。例如,"my_credentials.json"。

3 - 在本地运行函数:(注意猫)

$ FIREBASE_CONFIG=$(cat my_credentials.json) npm run local

注意 (!将"local"脚本添加到 package.json 文件中:

  "scripts": {
   ...
   "local": "npx functions-framework --target=<YOUR-APP-NAME> --signature-type=<YOUR-FUNCTION-CALL-METHOD-EXAMPLE-http>"
 },

尝试将此版本依赖项(package.json )与节点 v8 一起使用。

"dependencies": {
    "firebase-admin": "~7.1.1",
    "firebase-functions": "^2.2.1"
}

它对我有用。

最新更新