2012-04-22 9 views
9

Obiekt node.js process.env wydaje się przetwarzać przypisanie właściwości inaczej niż zwykłe obiekty JavaScript. Jak mogę uzyskać, aby obiekt process.env zachowywał się jak zwykły obiekt w tym przypadku?node.js process.env: przypisanie właściwości process.env do niezdefiniowanych wyników w typie łańcucha znaków?

Poniżej znajduje się przykładowy kod ilustrujący różne zachowanie przydziału. Z jakiegoś powodu przypisywania undefined do wyników nieruchomości w typu string (tylko dla process.env):

function demo(description, dict) { 
    console.log(description); 
    dict.A = undefined; 
    console.log('typeof dict.A: ' + typeof dict.A + '\n'); 
} 
demo('Passing empty object:', {}); 
demo('Passing process.env:', process.env); 

Uzyskany wynik jest różny w zależności czy pusty obiekt {} lub przedmiot process.env została podjęta:

 
$ node test.js 
Passing empty object: 
typeof dict.A: undefined 

Passing process.env: 
typeof dict.A: string 

Odpowiedz

25

Obiekt process.env wymusza na wszystkich jego właściwości ciąg znaków, ponieważ zmienne środowiskowe muszą zawsze być ciągami. Nie jestem do końca pewien na celu, ale może można spróbować jednego z nich jako obejście:

  • skopiować obiekt do nowego obiektu process.env, który będzie następnie zachowywać normalnie:

    envCopy = {}; 
    for (e in process.env) envCopy[e] = process.env[e]; 
    
  • Przypisywanie '' do właściwości zamiast jeśli chcesz to być „puste”

    process.env.A = ''; 
    

    który następnie return false jeśli traktować go jako logiczna

    if (process.env.A) { 
        ... 
    } 
    
  • Albo jak Jonathan Lonowski zwraca uwagę, można również delete klucz od process.env

    delete process.env.A; 
    

nadzieję, że to pomaga

+0

mam emulacji skrypt bash w JavaScript (w celu porcie todo.txt-CLI). Oba rozwiązania zadziałały. Dzięki! – Leftium

+0

Zasługujesz na więcej niż 6 głosów w tej sprawie. Jest to zdecydowanie nieoczekiwane, jeśli używasz javascript (choć może nie, jeśli naprawdę myślisz o tym, jak działa bash.). – tandrewnichols

+0

Dzięki za wskazanie użycia '' '' falsy –

12

Dzieje się tak dlatego, process.env sił wszystkich jej wartości do String:

process.env.A = undefined; 
console.log(process.env.A);  // 'undefined' (note the quotes) 

process.env.A = true; 
console.log(process.env.A);  // 'true' 
console.log(typeof process.env.A); // 'string' 

Jeśli trzeba usunąć zmienną środowiskową, musisz delete go:

function demo(description, dict) { 
    console.log(description); 
    delete dict.A; 
    console.log('typeof dict.A: ' + typeof dict.A + '\n'); 
} 
demo('Passing process.env:', process.env); 

// Passing process.env: 
// typeof dict.A: undefined 
Powiązane problemy