Wie richten Sie lokale Umgebungsvariablen für Cloud-Funktionen für Firebase ein?

71

Ich verwende http-Cloud-Funktionen, um auf eine Anfrage zu warten und dann eine einfache Nachricht zurückzugeben.

Ich entwickle Cloud-Funktionen lokal mit:

firebase serve --only functions

Ich habe einige benutzerdefinierte Umgebungsvariablen mit eingerichtet

firebase functions:config:set

Der Zugriff auf die benutzerdefinierten Konfigurationsvariablen mit dem folgenden Code funktioniert einwandfrei, wenn das Projekt bereitgestellt wird

 functions.config()

Bei lokaler Entwicklung funktioniert dies jedoch nicht. Wenn die Funktion durch Drücken von: http: // localhost: 5002 / my-project-name / us-central1 / functionName ausgelöst wird, kann ich nicht auf die benutzerdefinierten Konfigurationsvariablen zugreifen. Wenn ich functions.config () lokal verwende, kann ich die Standardkonfiguration sehen, nur nicht meine benutzerdefinierten Konfigurationsvariablen

Gibt es eine alternative Lösung oder bewährte Methode für Umgebungsvariablen, wenn Sie lokal arbeiten?

ChrisMacSEA
quelle
Könnten Sie genauer sagen, was Sie tun, wenn Sie sagen, dass Sie sich lokal entwickeln?
Doug Stevenson
@ DougStevenson Ich habe die Frage aktualisiert. Hoffentlich bietet das ein bisschen mehr Klarheit darüber, was ich tue
ChrisMacSEA
Ich sehe das gleiche Problem. Ich werde intern einen Fehler melden (ich bin beim Firebase-Team). Sie können auch einen Fehlerbericht unter firebase.google.com/support/contact/bugs-features
Doug Stevenson am

Antworten:

115

Ab sofort müssen Sie mit diesem Befehl manuell eine .runtimeconfig.jsonDatei in Ihrem Funktionsverzeichnis erstellen . Führen Sie dann den Serve-Befehl aus.

firebase functions:config:get > .runtimeconfig.json

Wenn Sie Windows Powershell verwenden, ersetzen Sie das oben Gesagte durch:

firebase functions:config:get | ac .runtimeconfig.json

Weitere Informationen finden Sie unter https://firebase.google.com/docs/functions/local-emulator

laurenzlong
quelle
Könnten Sie den lokalen Konfigurationssatz detailliert beschreiben, um die Funktion zu testen, die FCM-Benachrichtigungen sendet?
ThierryC
1
Mein Trigger startet eine FCM-Benachrichtigung bei der Benutzererstellung. Es funktioniert auf einem Firebase-Server, wurde jedoch lokal getestet. Ich habe den Fehler: "info: Funktion abgestürzt {Fehler: Beim Versuch, sich bei den FCM-Servern zu authentifizieren, ist ein Fehler aufgetreten. Stellen Sie sicher, dass die zur Authentifizierung dieses SDK verwendeten Anmeldeinformationen über die richtigen Berechtigungen verfügen . Siehe firebase .google.com / docs / admin / setup für Setup-Anweisungen. Antwort des R aw-Servers: "<HTML> <HEAD> <TITLE> Nicht autorisiert </ TITLE> </ HEAD> <BODY BGCOLOR =" # FFFFFF "TEXT =" # 000000 "> <H1> Nicht autorisierter </ H1> <H2> Fehler 401 </ H2> </ BODY> </ HTML>". Statuscode: 401. "
ThierryC
4
Beachten Sie hierbei, dass sich die oben genannte JSON-Datei functionswie in dem oben genannten Beitrag in Ihrem Verzeichnis befinden muss. Führen Sie also den obigen Ausschnitt aus, ohne sich zuerst im Funktionsverzeichnis zu befinden (sagen Sie, wenn Sie sich stattdessen im Stammverzeichnis des Firebase-Projekts befinden). wird nicht funktionieren. In diesem Fall müssten Sie firebase functions:config:get > functions/.runtimeconfig.jsonstattdessen so etwas ausführen .
Keegan Brown
5
Ich arbeite nicht für mich. Ich habe die ".runtimeconfig.json" im Verzeichnis "functions", die mit "functions: config: get> .runtimeconfig.json" generiert wurde. Wenn ich mich jedoch in localhost befinde und "functions.config ()" in meinem Projekt ausführe, wird ein leeres Objekt zurückgegeben.
Cabuxa.Mapache
2
@ Cabuxa.Mapache hast du herausgefunden, warum es ein leeres Objekt zurückgibt? Ich habe das gleiche Problem, weil bei firebase functions:config:get > .runtimeconfig.jsonjeder Ausführung auf einem Mac tatsächlich alle Daten in dieser Datei durch ein leeres JSON-Objekt ersetzt werden. Ich habe es mit verschiedenen Dateinamen wie .devConfig.jsonund versucht .serveConfig.json, aber der im Befehl angegebene Dateiname wird überschrieben mit einem leeren JSON-Objekt ..
Kat
11

Für diejenigen, die die Umgebungsvariablen (process.env) verwenden möchten, befolge ich diese Problemumgehung.

Legen Sie die Konfigurationswerte vor der Bereitstellung fest

firebase functions:config:set envs.db_host=$DB_HOST_PROD envs.db_user=$DB_USER_PROD envs.db_password=$DB_PASSWORD_PROD envs.db_name=$DB_NAME_PROD envs.db_use_ssl=false

Lesen Sie die Konfiguration und aktualisieren Sie die env-Variablen als erstes unter Ihrem Funktionscode.

const functions = require('firebase-functions');
const config = functions.config();
// Porting envs from firebase config
for (const key in config.envs){
  process.env[key.toUpperCase()] = config.envs[key];
}
Muthukumar
quelle
4

Sie können eine Datei mit dem Namen .env.json behalten und laden, wenn Sie den Bereitstellungsbefehl auslösen

{
  "name": "project",
  "version": "0.0.0",
  "scripts": {
    "deploy": "npm run env && firebase deploy --only functions",
    "env": "test -f env.json && firebase functions:config:unset env && firebase functions:config:set env=\"$(cat env.json)\" || echo \"Please add the file env.json before deploy.\""
  },
  "dependencies": {
    "firebase-functions": "^3.1.0"
  },
  "devDependencies": {
    "firebase-functions-test": "^0.1.6"
  }
}
Kodex
quelle
1

Ich habe das Problem auf Windows Powershell eingegrenzt.

Das Ausführen von Firebase-Funktionen: config: get> .runtimeconfig.json in Powershell generiert einen defekten JSON. Ich weiß nicht warum. Wenn dieser analysiert wird, wird in JSON an Position 0 ein unerwartetes Token angezeigt.

Ich habe es geschafft, es zu sortieren, indem ich den Generierungsbefehl .runtimeconfig.json in der Windows-Eingabeaufforderung ausgeführt habe.

saran0798
quelle
0

Ich bin nicht sicher, ob die am besten bewertete Antwort funktioniert oder nicht, aber für die Firebase-Funktion auf dem Mac (lokal zu bedienen) mache ich so etwas

npm run admin-keys && export dev=true && firebase emulators:start

Wo Admin-Schlüssel sind

"admin-keys": "export GOOGLE_APPLICATION_CREDENTIALS='./.keys/admin.keys.json'"

Dadurch wird die Konfiguration von geladen .runtimeconfig.json

Für die Produktion müssten Sie es manuell einstellen, indem Sie so etwas tun

firebase functions:config:set facebookCred.secret="something"
iRohitBhatia
quelle