Wo lege ich Konfigurationen ab? – Eine einfache Anleitung in Knoten.JS

Jack Yeh

Folgen

1. Februar 2020 * 6 min Lesezeit

Verbessern Sie die Qualität des Code-Repositorys, indem Sie diesem Codierungsmuster folgen!

tl; dr: Überprüfen Sie das Code-Repo unter https://github.com/teamzerolabs/config-service-reference .

Höchstwahrscheinlich ja. Solange Ihr Programm eine Verbindung herstellt oder Anrufe an Remote-Endpunkte tätigt, müssen die Sicherheitsanmeldeinformationen von irgendwoher abgerufen werden.

Es gibt viele verschiedene Möglichkeiten, diese Anmeldeinformationen in das Programm zu laden:

Hoffen wir, dass wir dies aufklären und reduzieren können.

Level 1: Hartcodieren Sie es in der Textdatei selbst — Dies geschieht normalerweise an einem Freitag oder für Leute, die gerade erst anfangen. Das Referenz-Repo sollte Ihnen helfen, Code zu haben, den Sie verwenden können, anstatt dies zu tun.

Ebene 2: Laden aus dem Prozess.env-Objekt an der Stelle, an der die Verbindung hergestellt wird — Dies ist besser als eine harte Codierung, macht es jedoch im Laufe der Zeit schwierig, die Umgebungsvariable zu verfolgen. Weil Sie nicht zu einer einzelnen Datei gehen können, um alle referenzierten Umgebungsvariablen zu finden.

Level 3: Laden Sie alle Umgebungskonfigurationen aus einer einzigen Datei – Dies wird in diesem Artikel und Codebeispiel bereitgestellt! Dies gibt Ihnen den Vorteil, dass Sie wissen, wohin Sie gehen müssen, um Konfigurationen nachzuschlagen, und dass das Programm frühzeitig fehlschlagen kann, wenn schlechte Werte angegeben wurden.

Level 4: Verwandeln Sie das Konfigurationsskript in einen Dienst — Auf diese Weise können wir andere interessante Dinge tun: Typprüfung geladener Werte und Laden zusätzlicher Konfigurationen aus S3 oder der Datenbank, bevor anderer Initialisierungscode ausgeführt wird.

Bevor Sie beginnen

  • Haben Sie einen Knoten.JS Runtime bereit (Version > 10)
  • Holen Sie sich Postman, wenn Sie dies nicht getan haben — Alternativ können Sie den Browser oder Curl verwenden, um auf die API zuzugreifen.
  • Checken Sie https://github.com/teamzerolabs/config-service-reference in Ihrem lokalen Bereich aus.
  • Haben Sie ein MySQL zum Laufen: Ich habe eine Docker-Compose-Datei in den Ordner db-setup aufgenommen, die Sie hochfahren können, indem Sie dorthin gehen und docker-compose up -d ausführen.

Ein kurzes Beispiel – Minimaler Buchdienst, der in der MySQL-Datenbank gespeicherte Bücher zurückgibt

3 gute Bücher!

Im ersten Ordner node-starthere haben wir zwei Dateien:

  • haupt.js – Hier richten wir den express -Server ein, um die Anforderung unter localhost:3000/books
  • models/index .js – Wir werden mit mysql2 und sequelize eine Verbindung zu MySQL herstellen.
  • Führen Sie yarn start aus, um loszulegen.

Sie können sehen, wie die Datenbankanmeldeinformationen derzeit gespeichert sind models/index.js :

Es ist hier hart codiert, aber wir können es besser machen.

Der Nachteil der harten Codierung von Datenbankanmeldeinformationen

  • Es ist nicht sicher — Jeder, der das öffentliche Repository auscheckt, weiß jetzt zu viel, insbesondere wenn Ihre Datenbankinstanz öffentlich ist, ist sie jetzt verfügbar.
  • Es ist schwierig, mit verschiedenen Umgebungen zu arbeiten – Wenn Sie diesen Code mit Test- oder Produktionsbereitstellungen verbinden müssen, möchten Sie keine Codeänderungen nur für die Bereitstellung vornehmen.

Schritt #1 – Laden Sie jede dieser Umgebungsvariablen

Sie können hier mehr über Umgebungsvariablen lesen. Der Kern davon ist, dass Sie Werte in das laufende Programm wie folgt übergeben können

Dieser Ansatz ist in Ordnung, wenn Sie eine kleine Anzahl von Konfigurationen haben, aber wie wir alle wissen, werden alle Projekte, die den ersten Monat der Nutzung überlebt haben, mit mehr Diensten integriert. (Ein aktuelles 4-monatiges Projekt von mir hat 40 Variablen! Stellen Sie sich vor, Sie tippen sie für die Garnstartanweisung oben ein, es ist zu viel).

Schritt # 2 – Laden Sie Umgebungsvariablen zur Laufzeit für die lokale Entwicklung vor der Verwendung.

Zum Glück gibt es ein Paket, das uns davor bewahrt, die Variablen immer wieder einzutippen. Es heißt dotenv . Sie verwenden dotenv wie folgt:

Legen Sie Ihren Code unter src , erstellen Sie einen Konfigurationsordner und erstellen Sie dort eine .env -Datei:

DATABASE_URL=localhost
DATABASE_PORT=3306
DATABASE_USERNAME=root
DATABASE_PASSWORD=dIKnUfyfUPURi9irSplTOqGO4OtE0
DATABASE_NAME=configexample

Und dotenv.config lädt die Variablen in den Textdateien in process.env , jetzt können Sie die Eingabe der Variablen bei yarn start überspringen!

Schritt #3 – Bequeme Methoden, um Werte zu analysieren und vorzeitig zu beenden, wenn sie fehlen

Das einzige, was gefährlicher ist als ein falsch konfiguriertes Programm, ist ein falsch konfiguriertes Programm, das monatelang läuft.

Wenn wir vergessen haben, die .env -Datei zu erstellen oder schlechte Werte einzugeben, möchten wir dies im Idealfall so früh wie möglich wissen. Das Ausführen von Code mit unvollständiger oder falscher Konfiguration erschwert die Fehlerbehebung.

Wenn Sie sich den zweiten Ordner node-with-config-service ansehen, können Sie sehen, dass die folgenden Dienstprogrammmethoden hinzugefügt und zum Analysieren der Variablen verwendet werden:

Und wir schreiben den Abschnitt Datenbankverbindung in diesen um:

Das Programm wird jetzt vorzeitig mit Fehlern beendet, wenn Umgebungsvariablen fehlen, und Sie können sich auf ein statisches Konfigurationsobjekt verlassen, das von einer beliebigen Stelle im Programm vorhanden ist!

Es gibt zwei weitere Erweiterungen für diesen Ansatz— Sie können dieselben Muster in TypeScript anwenden und einen Schritt darüber hinausgehen, indem Sie einen tatsächlichen Hilfsdienst in NestJS einrichten. Beide sind im Git-Repo enthalten. Wir werden diese in einem zukünftigen TypeScript + NestJS-Artikel behandeln!