Node.js: impostazione delle variabili di ambiente

Sto cercando di seguire un tutorial e dice:

“Ci sono alcuni modi per caricare le credenziali.

  1. Caricato da variabili di ambiente,
  2. Caricato da un file JSON su disco,

Le chiavi devono essere come segue:

USER_ID, USER_KEY 

… Ciò significa che se si impostano correttamente le variabili di ambiente, non è necessario gestire le credenziali nell’applicazione. ”

Sulla base di alcuni googling, sembra che ho bisogno di impostare le variabili in process.env ? Come e dove imposto queste credenziali? Esempio per favore.

Le variabili di ambiente (in questo caso) vengono utilizzate per trasmettere le credenziali alla tua applicazione. USER_ID e USER_KEY possono entrambi accedere rispettivamente da process.env.USER_ID e process.env.USER_KEY . Non è necessario modificarli, basta accedere ai loro contenuti.

Sembra che ti stiano semplicemente dando la possibilità di caricare USER_ID e USER_KEY da process.env o da un file specifico sul disco.

Ora, la magia si verifica quando si esegue l’applicazione.

USER_ID=239482 USER_KEY=foobar node app.js

Questo passerà l’id utente 239482 e la chiave utente come foobar . Questo è adatto per i test, tuttavia per la produzione, probabilmente configurerai alcuni script bash per esportare le variabili.

Consiglio vivamente di esaminare il pacchetto dotenv.

https://github.com/motdotla/dotenv

È simile alla libreria suggerita nella risposta di @Benxamin, ma è molto più pulita e non richiede alcun script di bash. Vale anche la pena notare che il codice base è popolare e ben mantenuto.

Fondamentalmente hai bisogno di un file .env (che consiglio vivamente di essere ignorato dal tuo git / mercurial / etc):

 FOO=bar BAZ=bob 

Quindi nel file di immissione dell’applicazione inserire la seguente riga il prima ansible:

 require('dotenv').config(); 

Boom. Fatto. ‘process.env’ ora conterrà le variabili sopra:

 console.log(process.env.FOO); // bar 

Il file ‘.env’ non è richiesto, quindi non devi preoccuparti che la tua app cada in caso di assenza.

Basta fornire i valori di env sulla riga di comando

 USER_ID='abc' USER_KEY='def' node app.js 

Se vuoi un’opzione di gestione, prova il pacchetto envs npm. Restituisce i valori dell’ambiente se sono impostati. Altrimenti, è ansible specificare un valore predefinito che è memorizzato in una variabile object predefinita globale, se non è nel proprio ambiente.

L’uso di file .env (“dot ee-en-vee”) o di ambiente va bene per molte ragioni. Gli individui possono gestire le proprie configurazioni. È ansible distribuire ambienti diversi (dev, stage, prod) ai servizi cloud con le proprie impostazioni dell’ambiente. Ed è ansible impostare valori predefiniti sensibili.

All’interno del tuo file .env ogni riga è una voce, come in questo esempio:

 NODE_ENV=development API_URL=http://api.domain.com TRANSLATION_API_URL=/translations/ GA_UA=987654321-0 NEW_RELIC_KEY=hi-mom SOME_TOKEN=asdfasdfasdf SOME_OTHER_TOKEN=zxcvzxcvzxcv 

Non dovresti includere .env nel tuo repository di controllo della versione (aggiungilo al tuo file .gitignore ).

Per ottenere variabili dal file .env nel proprio ambiente, è ansible utilizzare uno script bash per eseguire l’equivalente di export NODE_ENV=development prima di avviare l’applicazione.

 #!/bin/bash while read line; do export "$line"; done  

Quindi questo va nella tua applicazione javascript:

 var envs = require('envs'); // If NODE_ENV is not set, // then this application will assume it's prod by default. app.set('environment', envs('NODE_ENV', 'production')); // Usage examples: app.set('ga_account', envs('GA_UA')); app.set('nr_browser_key', envs('NEW_RELIC_BROWSER_KEY')); app.set('other', envs('SOME_OTHER_TOKEN)); 

È ansible impostare la variabile di ambiente tramite la variabile globale del processo come segue:

 process.env['NODE_ENV'] = 'production'; 

Funziona su tutte le piattaforms.

Dipende dal tuo sistema operativo e dalla tua shell

Su Linux con la shell bash, si creano variabili di ambiente come questa (nella console):

 export FOO=bar 

Per ulteriori informazioni sulle variabili di ambiente su ubuntu (ad esempio):

Variabili d’ambiente su ubuntu

Per gli utenti Windows questa domanda di Overflow dello stack e risposta top è abbastanza utile su come impostare le variabili di ambiente tramite la riga di comando

Come posso impostare NODE_ENV = produzione in Windows?

È venuto attraverso un bel strumento per farlo.

node-ENV-lima

Analizza e carica i file di ambiente (contenenti le esportazioni di variabili ENV) nell’ambiente Node.js, ovvero process.env – Utilizza questo stile:

 .env # some env variables FOO=foo1 BAR=bar1 BAZ=1 QUX= # QUUX= 

Passaggio 1: aggiungi le variabili di ambiente al loro file appropriato. Ad esempio, l’ambiente di staging può essere chiamato .env.staging , che contiene le variabili di ambiente USER_ID e USER_KEY , specifiche per l’ambiente di staging.

Passaggio 2: nel file package.json , aggiungere quanto segue:

 "scripts": { "build": "sh -ac '. ./.env.${REACT_APP_ENV}; react-scripts build'", "build:staging": "REACT_APP_ENV=staging npm run build", "build:production": "REACT_APP_ENV=production npm run build", ... } 

quindi chiamalo nello script di distribuzione in questo modo:

 npm run build:staging 

Super semplice set up e funziona come un fascino!

Fonte: https://medium.com/@tacomanator/environments-with-create-react-app-7b645312c09d

Importante per Windows: esistono diversi modi per impostare le variabili di ambiente. Ma molti di questi NON sono persistenti, sono temporanei per la shell corrente. (come SET SWEDISH_CHEF="bork bork" o $env:SWEDISH_CHEF = "bork bork" )

Per renderlo persistente usa questo comando di PowerShell: [Environment]::SetEnvironmentVariable("SWEDISH_CHEF", "bork bork", "User") nota: il terzo argomento, "User" , specifica il livello (può anche essere "Process" o "Machine" ma da quello che ho trovato "User" è in realtà quella usata per process.env )

Per verificare che persistesse: Avviare un nuovo terminale, eseguire il node e immettere process.env.SWEDISH_CHEF nella shell del nodo per stampare il valore.

modifica: l’env var non sembra persistere dopo il riavvio. così ho finito per impostarlo tramite la GUI in Risorse del computer per farlo rimanere per sempre

edit2: un’opzione più semplice è ovviamente solo per creare un file .env nella cartella del progetto. SWEDISH_CHEF="bork bork"

Come espansione della risposta @ctrlplusb,
Ti suggerisco di dare anche un’occhiata al pacchetto env-dot-prop .

Permette di impostare / ottenere proprietà da process.env usando un dot-path .

Supponiamo che process.env contenga quanto segue:

 process.env = { FOO_BAR: 'baz' 'FOO_🦄': '42' } 

Quindi puoi manipolare le variabili di ambiente in questo modo:

 const envDotProp = require('env-dot-prop'); console.log(process.env); //=> {FOO_BAR: 'baz', 'FOO_🦄': '42'} envDotProp.get('foo'); //=> {bar: 'baz', '🦄': '42'} envDotProp.get('foo.🦄'); //=> '42' envDotProp.get('foo.🦄', {parse: true}); //=> 42 envDotProp.set('baz.foo', 'bar'); envDotProp.get('', {parse: true}); //=> {foo: {bar: 'baz', '🦄': 42}, baz: {foo: 'bar'}} console.log(process.env); //=> {FOO_BAR: 'baz', 'FOO_🦄': '42', BAZ_FOO: 'bar'} envDotProp.delete('foo'); envDotProp.get(''); //=> {baz: {foo: 'bar'}} console.log(process.env); //=> {BAZ_FOO: 'bar'} 

Questo ti aiuta ad analizzare le variabili d’ambiente e ad usarle come oggetti di configurazione nella tua app.
Ti aiuta anche a implementare una configurazione a 12 fattori .

Un ottimo modo per fare variabili d’ambiente che ho usato con successo è qui sotto:

A. Hanno diversi file di configurazione :

  1. dev.js // questo ha tutte le variabili d’ambiente solo per lo sviluppo
    Il file contiene:

     module.exports = { ENV: 'dev', someEnvKey1 : 'some DEV Value1', someEnvKey2 : 'some DEV Value2' }; 
  2. stage.js // questo ha tutte le variabili d’ambiente solo per lo sviluppo

     .. 
  3. qa.js // questo ha tutte le variabili d’ambiente solo per il test qa
    Il file contiene:

     module.exports = { ENV: 'dev', someEnvKey1 : 'some QA Value1', someEnvKey2 : 'some QA Value2' }; 

NOTA : i valori stanno cambiando con l’ambiente, principalmente, ma i tasti rimangono uguali.

  1. puoi averne di più

  2. z__prod.js // questo ha tutte le variabili d’ambiente per produzione / solo live
    NOTA: questo file non è mai in bundle per la distribuzione

  3. Metti tutti questi file di configurazione in / config / cartella

     /config/dev.js /config/qa.js /config/z__prod.js /setenv.js /setenv.bat /setenv.sh 

NOTA : il nome di prod è diverso da altri, in quanto non sarebbe utilizzato da tutti.

B. Impostare le variabili d’ambiente OS / Lambda / AzureFunction / GoogleCloudFunction dal file di configurazione

Ora, idealmente, queste variabili di configurazione nel file dovrebbero andare come variabili d’ambiente del SO (o, variabili di funzione LAMBDA, o variabili di funzione di Azure, funzioni di Google Cloud, ecc.)

quindi, scriviamo l’automazione nel sistema operativo Windows (o altro)

  1. Supponiamo di scrivere il file bat ” setenv “, che accetta un argomento che è l’ambiente che vogliamo impostare

  2. Ora esegui ” setenv dev

a) Questo prende l’input dalla variabile argomento passato (‘dev’ per ora)
b) leggere il file corrispondente (‘config \ dev.js’)
c) imposta le variabili di ambiente nel SO Windows (o altro)

Per esempio,

Il contenuto di setenv.bat potrebbe essere:

  node setenv.js 

I contenuti di setenv.js potrebbero essere:

  // import "process.env.ENV".js file (dev.js example) // loop the imported file contents // set the environment variables in Windows OS (or, Lambda, etc.) 

Questo è tutto , il tuo ambiente è pronto per l’uso.

Quando fai ” setenv qa “, tutte le variabili d’ambiente qa saranno pronte per l’uso da qa.js e pronte per essere utilizzate dallo stesso programma (che richiede sempre process.env.someEnvKey1, ma il valore che ottiene è qa uno).

Spero possa aiutare.

Stavo diventando indefinito dopo aver impostato un sistema env var. Quando inserisco APP_VERSION nell’env utente, posso visualizzare il valore dal nodo tramite process.env.APP_VERSION