Ich habe an einigen Node-Apps gearbeitet und nach einem guten Muster zum Speichern von einstellungsbezogenen Einstellungen gesucht. In der Django-Welt (woher ich komme) besteht die übliche Praxis darin, eine settings.py
Datei mit den Standardeinstellungen (Zeitzone usw.) und dann eine local_settings.py
für die Bereitstellung spezifische Einstellungen zu haben, d. H. Mit welcher Datenbank soll gesprochen werden, mit welchem Memcache-Socket, welcher E-Mail-Adresse für die Administratoren und so weiter.
Ich habe nach ähnlichen Mustern für Node gesucht. Nur eine Konfigurationsdatei wäre schön, damit sie nicht mit allem anderen eingeklemmt werden muss app.js
, aber ich finde es wichtig, eine Möglichkeit zu haben, eine serverspezifische Konfiguration in einer Datei zu haben, die sich nicht in der Quellcodeverwaltung befindet. Dieselbe App könnte durchaus auf verschiedenen Servern mit völlig unterschiedlichen Einstellungen bereitgestellt werden und sich mit Zusammenführungskonflikten befassen müssen, und all das ist nicht meine Vorstellung von Spaß.
Gibt es dafür eine Art Framework / Tool oder hackt jeder einfach selbst etwas zusammen?
Antworten:
Ich verwende a
package.json
für meine Pakete und aconfig.js
für meine Konfiguration, die wie folgt aussieht:Ich lade die Konfiguration aus meinem Projekt:
und dann kann ich meine Sachen zugreifen
config.db_host
,config.db_port
etc ... Auf diese Weise können Sie mich entweder Gebrauch fest einprogrammierten Parameter oder Parameter in Umgebungsvariablen gespeichert , wenn ich nicht zum Speichern von Passwörtern in der Quellcodeverwaltung will.Ich generiere auch einen
package.json
und füge einen Abhängigkeitsabschnitt ein:Wenn ich das Projekt auf meinen lokalen Computer klone
npm install
, starte ich , um die Pakete zu installieren. Mehr Infos dazu hier .Das Projekt wird in GitHub gespeichert und Fernbedienungen für meinen Produktionsserver hinzugefügt.
quelle
Sie können JSON-Dateien ab Node v0.5.x anfordern (unter Bezugnahme auf diese Antwort ).
config.json:
app.js:
quelle
Viel später fand ich ein ziemlich gutes Node.js-Modul zum Verwalten der Konfiguration: nconf .
Ein einfaches Beispiel:
Es unterstützt auch das Speichern von Einstellungen in Redis , das Schreiben von Konfigurationsdateien und verfügt über eine ziemlich solide API. Außerdem wird es von einem der angesehensten Node.js-Shops, Nodejitsu , als Teil der Flatiron- Framework-Initiative unterstützt ziemlich zukunftssicher.
Schauen Sie sich nconf bei Github an .
quelle
Meine Lösung ist ziemlich einfach:
Laden Sie die Umgebungskonfiguration in ./config/index.js
Definieren Sie einige Standardeinstellungen in ./config/config.global.js
Überschreiben Sie die Standardeinstellungen in ./config/config.test.js
Verwenden Sie es in ./models/user.js:
Ausführen Ihrer App in einer Testumgebung:
quelle
NODE_ENV
standardmäßig "Entwicklung". Sie sollten stattdessen nach "Produktion" suchen.Sie können auch nach dotenv suchen, das den Grundsätzen einer Zwölf-Faktor-App folgt .
Ich habe früher node-config verwendet, aber aus diesem Grund dotenv erstellt. Es wurde vollständig von Rubys Dotenv-Bibliothek inspiriert.
Die Verwendung ist recht einfach:
Dann erstellen Sie einfach eine .env-Datei und geben Ihre Einstellungen wie folgt ein:
Das ist dotenv für nodejs.
quelle
foreman run node xx.js
diese Option, um automatisch auch Ihre .env-Datei einzulesen..env
Datei in Ihrer Versionskontrolle oder Bereitstellungsprozess.Verwendet ihr npm, um eure Skripte zu starten (env etc)?
Wenn Sie
.env
Dateien verwenden, können Sie diese in Ihre Dateien aufnehmenpackage.json
und sie mit npm als Quelle / Start verwenden.Beispiel:
Führen Sie dann die npm-Skripte aus:
Es ist hier beschrieben https://gist.github.com/ericelliott/4152984 Alle Dank an Eric Elliot
quelle
source : not found
source
(oder einfach.
) ist ein in Unix-Shells (Bash usw.) integrierter Befehl zum Lesen und Ausführen von Befehlen aus der angegebenen Datei in der aktuellen Shell . Das heißt, die Befehle werden nicht in einer Unterschale ausgeführt. Dies hat in diesem Beispiel zur Folge, dass die in definierten Umgebungsvariablenprod.env
zur aktuellen Shell hinzugefügt und somit an jeden untergeordneten Prozess übergeben werden, der von dieser Shell erzeugt wird. Sie scheinen Windows CMD zu verwenden. Weitere Informationen finden Sie in dieser Frage .dev.env
undprod.env
, aber mit einer einzelnen.env
Datei pro deploy.Sie können sich auch die Knotenkonfiguration ansehen, die die Konfigurationsdatei abhängig von der Variablen $ HOST und $ NODE_ENV lädt (ein bisschen wie RoR): Dokumentation .
Dies kann für unterschiedliche Einsatz Einstellungen sehr nützlich sein (
development
,test
oderproduction
).quelle
Mach einfach ein
settings.js
mitexports
:Führen Sie dann in Ihrem Skript Folgendes aus
require
:Alle Ihre Einstellungen sind jetzt über die
settings
Variable verfügbar :quelle
Ich werde hier meinen Hut in den Ring werfen, weil keine dieser Antworten alle kritischen Komponenten anspricht, die so ziemlich jedes System benötigt. Überlegungen:
So mache ich meine Konfiguration:
config.default.private.js
- In der Versionskontrolle sind dies Standardkonfigurationsoptionen, die nur von Ihrem Backend angezeigt werden.config.default.public.js
- In der Versionskontrolle sind dies Standardkonfigurationsoptionen, die vom Backend und Frontend angezeigt werdenconfig.dev.private.js
- Wenn Sie andere private Standardeinstellungen für dev benötigen.config.dev.public.js
- Wenn Sie unterschiedliche öffentliche Standardeinstellungen für dev benötigen.config.private.js
- Nicht in der Versionskontrolle, dies sind umgebungsspezifische Optionen, die überschrieben werdenconfig.default.private.js
config.public.js
- Nicht in der Versionskontrolle, dies sind umgebungsspezifische Optionen, die überschrieben werdenconfig.default.public.js
keys/
- Ein Ordner, in dem jede Datei ein anderes Geheimnis speichert. Dies steht auch nicht unter Versionskontrolle (Schlüssel sollten niemals unter Versionskontrolle stehen).Ich verwende einfache alte Javascript-Dateien für die Konfiguration, damit ich die volle Leistung der Javascript-Sprache nutzen kann (einschließlich Kommentaren und der Möglichkeit, beispielsweise die Standard-Konfigurationsdatei in die umgebungsspezifische Datei zu laden, damit sie dann überschrieben werden können). Wenn Sie Umgebungsvariablen verwenden möchten, können Sie diese in diese Konfigurationsdateien laden (obwohl ich aus dem gleichen Grund, aus dem ich die Verwendung von JSON-Dateien nicht empfehle, die Verwendung von Env-Variablen ablehne - Sie haben nicht die Fähigkeit einer Programmiersprache zum Erstellen Ihre Konfiguration).
Der Grund, warum sich jeder Schlüssel in einer separaten Datei befindet, liegt im Installationsprogramm. Auf diese Weise können Sie ein Installationsprogramm einrichten, das Schlüssel auf dem Computer erstellt und im Schlüsselordner speichert. Ohne dies kann Ihr Installationsprogramm fehlschlagen, wenn Sie Ihre Konfigurationsdatei laden, die nicht auf Ihre Schlüssel zugreifen kann. Auf diese Weise können Sie das Verzeichnis durchlaufen und alle Schlüsseldateien laden, die sich in diesem Ordner befinden, ohne sich Gedanken darüber machen zu müssen, was in einer bestimmten Version Ihres Codes vorhanden ist und was nicht.
Da Sie wahrscheinlich Schlüssel in Ihrer privaten Konfiguration geladen haben, möchten Sie Ihre private Konfiguration definitiv nicht in einen Frontend-Code laden. Während es wahrscheinlich strikt idealer ist, Ihre Frontend-Codebasis vollständig von Ihrem Backend zu trennen, ist PITA häufig eine ausreichend große Barriere, um zu verhindern, dass Benutzer dies tun, also private oder öffentliche Konfiguration. Ich tue jedoch zwei Dinge, um zu verhindern, dass private Konfigurationen in das Frontend geladen werden:
Eine letzte Sache: Ihre Konfiguration sollte über eine völlig separate Datei in den Browser geladen werden als jeder andere Frontend-Code. Wenn Sie Ihren Frontend-Code bündeln, sollte die öffentliche Konfiguration als vollständig separates Bundle erstellt werden. Andernfalls ist Ihre Konfiguration nicht mehr wirklich konfiguriert - sie ist nur ein Teil Ihres Codes. Die Konfiguration muss auf verschiedenen Computern unterschiedlich sein können.
quelle
Convict ist eine weitere Option, mit der ein Schema zur Validierung hinzugefügt wird. Wie nconf unterstützt es das Laden von Einstellungen aus einer beliebigen Kombination von Umgebungsvariablen, Argumenten, Dateien und JSON-Objekten.
Beispiel aus der README:
Erste Schritte Artikel: Konfigurieren von Konfigurationen mit Node-Convict
quelle
Sie können Konfig für umgebungsspezifische Konfigurationsdateien verwenden. Es lädt automatisch JSON- oder YamL-Konfigurationsdateien, verfügt über Standardwerte und dynamische Konfigurationsfunktionen.
Ein Beispiel aus dem Konfig-Repo:
In Entwicklung:
Nehmen wir in der Produktion an, wir starten die Anwendung mit
$ NODE_ENV=production PORT=4567 node app.js
Weitere Details: https://github.com/vngrs/konfig
quelle
Ich werde einen Ordner als Konfiguration und Dateinamen erstellen
config.js
und später diese Datei verwenden, wo immer dies erforderlich ist (siehe unten)Beispiel für config.js
Dann, wenn ich diese Konfigurationsdatei irgendwo verwenden möchte
Ich werde zuerst wie unten importieren
var config = require('./config');
und ich kann auf die Werte wie folgt zugreifen
quelle
Verwenden Sie einfach das
npm
Modulconfig
(mehr als 300000 Downloads)https://www.npmjs.com/package/config
Node-config organisiert hierarchische Konfigurationen für Ihre App-Bereitstellungen.
Sie können eine Reihe von Standardparametern definieren und diese für verschiedene Bereitstellungsumgebungen (Entwicklung, QA, Staging, Produktion usw.) erweitern.
quelle
Es ist besser, die Konfigurationen "Entwicklung" und "Produktion" zu trennen.
Ich benutze folgende Methode: Hier ist meine Datei config / index.js :
Verwenden Sie für die Konfiguration Folgendes:
Dann können Sie Ihr Konfigurationsobjekt verwenden:
quelle
module.exports = config;
am Ende derconfig/index.js
DateiIch bin etwas spät im Spiel, aber ich konnte hier oder anderswo nicht finden, was ich brauchte, also habe ich selbst etwas geschrieben.
Meine Anforderungen an einen Konfigurationsmechanismus sind folgende:
settings-overrides.js
- sieht gleich aus, erlaubt aber Überschreibungen der Konfiguration beisettings.js
. Die Idee hier ist, die Konfiguration einfach zu ändern, ohne den Code zu ändern. Ich finde es nützlich für Saas.Auch wenn mir unterstützende Umgebungen weniger wichtig sind, wird hier erklärt, wie ich sie einfach zu meiner Lösung hinzufügen kann
Erläuterung
undefined
bedeutet, dass diese Eigenschaft erforderlich istnull
bedeutet, dass es optional istmeConf
- Derzeit ist der Code Ziel einer Datei unterapp
.meConf
ist das Überschreiben von Dateien, auf die abgezielt wirdconf/dev
- was von meinen vcs ignoriert wird.publicConfiguration
- wird vom Frontend und Backend aus sichtbar sein.privateConfiguration
- wird nur vom Backend aus sichtbar sein.sendPublicConfiguration
- Eine Route, die die öffentliche Konfiguration verfügbar macht und sie einer globalen Variablen zuweist. Der folgende Code macht beispielsweise die öffentliche Konfiguration als globale Variable myConf im Frontend verfügbar. Standardmäßig wird der globale Variablenname verwendetconf
.app.get ("/ backend / conf", require ("conf"). sendPublicConfiguration);
Logik der Überschreibungen
Unterstützung für die Umgebung hinzufügen
Auch wenn ich eine "Umgebungsunterstützung" nicht nützlich finde, wird es vielleicht jemand tun.
Um Umgebungsunterstützung hinzuzufügen, müssen Sie die meConf require-Anweisung in etwa so ändern (Pseudocode).
if (Umwelt == "Produktion") {meConf = erfordern ("../ conf / dev / meConf"). Produktion; }}
if (environment == "development") {meConf = require ("../ conf / dev / meConf"). development; }}
Ebenso können Sie eine Datei pro Umgebung haben
und importiere den richtigen. Der Rest der Logik bleibt gleich.
quelle
undefined
wirklich "erforderlich" undnull
"optional" bedeutet. Also ist der gelbe Behälter für Plastik und der blaue für Altpapier? gut, musste aber das Handbuch lesen, bevor ich den Wurf wegwarf.Ein altes Beispiel, das ich gerade verwendet habe, weil ich mehr Flexibilität als eine typische .json-Datei wollte, aber nicht wollte, dass sie in eine Bibliothek abstrahiert wird, für die eine Abhängigkeit erforderlich wäre. Grundsätzlich wird eine sofort aufgerufene Funktion exportiert, die ein Objekt mit den von mir gewünschten Werten zurückgibt. Gibt viel Flexibilität.
Es gibt hier eine viel bessere Erklärung mit vollständigem Beispiel. Verwenden von Konfigurationsdateien in Node.js.
quelle
Ich weiß, dass dies ein wirklich alter Beitrag ist. Aber ich möchte mein Modul für die Konfiguration von Umgebungsvariablen freigeben. Ich denke, es ist eine sehr flexible Lösung. Hier ist das Modul json-configure
Dann können Sie
process.env.NODE_ENV
alle Variablen für Ihre Umgebung abrufen.quelle
Neben dem NConf Modul in erwähnter dieser Antwort , und Knoten-config in erwähnter diese Antwort gibt es auch Knoten-iniparser und IniReader , die einfache ini - Konfigurationsdatei - Parser zu sein scheint.
quelle
iniparser
Dies unterstreicht stolz die Tatsache, dass sie wissen, wie man Abschnitte in der Konfiguration analysiert. 2013. Wenn Sie eine tiefere Verschachtelung benötigen, sagen Sie[foo/bar]
?[foo\bar]
?bar.baz=42
?bar/baz=42
?bar\baz=42
?bar:baz=42
? Wie erkennt man42
eine Zahl? Es könnte ein ganzstelliger Text sein! - Werfen Sie XML, werfen Sie YAML, werfen Sie WIN.INI, umarmen Sie JSON, die Sorgen sind weg.Ich habe kürzlich ein kleines Modul veröffentlicht, um alle Arten von Konfigurationsdateien zu laden. Es ist ziemlich einfach, Sie können es unter https://github.com/flesler/config-node überprüfen
quelle
Sie können pconf verwenden: https://www.npmjs.com/package/pconf
Beispiel:
quelle
Hier ist ein ordentlicher Ansatz, der von diesem Artikel inspiriert wurde . Es sind keine zusätzlichen Pakete außer dem allgegenwärtigen Lodash-Paket erforderlich . Darüber hinaus können Sie verschachtelte Standardeinstellungen mit umgebungsspezifischen Überschreibungen verwalten.
Erstellen Sie zunächst einen Konfigurationsordner im Paketstammpfad, der so aussieht
Hier ist die Datei index.js
Nehmen wir nun an, wir haben eine solche defaults.json
und development.json gefällt das
Wenn Sie
config = require('./config')
hier tun, werden Sie bekommenBeachten Sie, dass Sie alle Standardwerte außer den in umgebungsspezifischen Dateien definierten erhalten. So können Sie eine Konfigurationshierarchie verwalten. Durch
defaultsDeep
die Verwendung wird sichergestellt, dass Sie sogar verschachtelte Standardeinstellungen haben können.quelle
Für diejenigen, die diesen alten Thread hier besuchen, ist ein Paket, das ich gut finde.
https://www.npmjs.org/package/config
quelle
Ich habe hier einige Lösungsvorschläge ausprobiert, war aber nicht zufrieden damit. Deshalb habe ich mein eigenes Modul erstellt. Es wird aufgerufen
mikro-config
und der Hauptunterschied besteht darin, dass die Konvention gegenüber der Konfiguration berücksichtigt wird. Sie können also einfach das Modul benötigen und es verwenden.Sie speichern Ihre Konfiguration entweder in einfachen js- oder json-Dateien aus dem
/config
Ordner. Zuerst wird einedefault.js
Datei geladen , dann alle anderen Dateien aus dem/config
Verzeichnis, dann wird die umgebungsspezifische Konfiguration basierend auf geladen$NODE_ENV
Variablen geladen.Außerdem kann diese Konfiguration für die lokale Entwicklung mit
local.js
oder umgebungsspezifisch überschrieben werden/config/env/$NODE_ENV.local.js
.Sie können es hier ansehen:
https://www.npmjs.com/package/mikro-config
https://github.com/B4nan/mikro-config
quelle
Lange habe ich den in der Lösung hier erwähnten Ansatz verwendet. Es gibt jedoch Bedenken hinsichtlich der Sicherheit der Geheimnisse im Klartext. Sie können ein anderes Paket darüber verwenden
config
damit die Sicherheitsbits erledigt werden.Überprüfen Sie dies: https://www.attosol.com/secure-application-secrets-using-masterkey-in-azure-key-vault/
quelle