Assegnazione di valori predefiniti dalla variabile di ambiente in Node.js

2

Quando tenti di impostare valori predefiniti per parametri che possono esistere in variabili di ambiente in JavaScript, vedo spesso questo modello:

var lag;

try {
    lag = process.env.THROTTLE_LAG;
}
catch ( e ) {
    lag = 100;
}

Non mi piace perché, mentre segue un modello JavaScript comune di dichiarare una variabile vuota allo scopo di assegnargli successivamente un valore in modo condizionale, lo schema di utilizzo di try / catch come uno stratagemma logico di ramificazione sembra poco fico. Esaminando i fattori tecnici, tende ad eseguire sub-ottimamente se confrontato con altre strategie di ramificazione. Esaminando i fattori umani, i colleghi hanno sostenuto che manca di leggibilità. Ovviamente opinioni diverse .

Questa soluzione più corta utilizza un blocco di cattura vuoto, il che mi fa rabbrividire.

var lag = 100;

try {
    lag = process.env.THROTTLE_LAG;
}
catch ( e ) {}

(Sono aperto all'idea che il mio rabbrividire è riflessivo e non riflette un vero problema.)

    
posta msanford 25.02.2015 - 20:12
fonte

1 risposta

4

L'utilizzo di try/catch per le diramazioni logiche non è raccomandato in generale, ma esistono usi legittimi. Un esempio, quando devi interrogare un'API di terze parti e non c'è altro modo per accedervi. Per mantenere il tuo codice più leggibile, potresti incapsulare il try / catch in una singola funzione isolata come

 function GetSomethingFromThirdPartyApi(parameter, defaultvalue)
 {
     try
     {
         return ThirdPartyApiCall(parameter);
     }
     catch(e)
     {
         return defaultvalue;
     }
 }

Ai miei occhi questa funzione è molto chiara e concisa.

Quindi consiglio di evitare culti mercantili come "Ho sentito che [xyz] è cattivo, quindi non voglio mai usarlo" e rimanere pragmatico - quando alternative più pulite causano più mal di testa di quanto non impediscano, usa ciò che funziona, dogmi risolve i problemi

Tuttavia, nell'esempio dato, puoi effettivamente risolvere il tuo problema senza l'uso di try catch, con una funzione come

function GetEnvironmentVar(varname, defaultvalue)
{
    var result = process.env[varname];
    if(result!=undefined)
        return result;
    else
        return defaultvalue;
}

ora puoi usarlo come

 var lag = GetEnvironmentVar("THROTTLE_LAG",100);

Questo è probabilmente quello che stai cercando.

    
risposta data 25.02.2015 - 22:45
fonte

Leggi altre domande sui tag