15

node.jsprocess.env对象处理属性分配的方式似乎与常规 JavaScript 对象不同。在这种情况下,如何让process.env对象像普通对象一样工作?

下面是说明不同分配行为的示例代码。出于某种原因,分配undefined给属性会导致字符串类型(仅适用于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);

结果输出不同,具体取决于是否传递了空对象{}或对象:process.env

$节点测试.js
传递空对象:
typeof dict.A: 未定义

传递 process.env:
typeof dict.A: 字符串
4

2 回答 2

42

process.env对象强制其所有属性为字符串类型,因为环境变量必须始终为字符串。我不完全确定您的目的,但也许您可以尝试其中一种作为解决方法:

  • process.env对象复制到一个新对象中,然后该对象将正常运行:

    envCopy = {};
    for (e in process.env) envCopy[e] = process.env[e];
    
  • ''如果您希望它是“空白”,则分配给一个属性

    process.env.A = '';
    

    当您将其视为布尔值时,它将返回 false

    if (process.env.A) {
        ...
    }
    
  • 或者正如Jonathan Lonowski指出的那样,您也可以deleteprocess.env

    delete process.env.A;
    

希望这可以帮助

于 2012-04-22T04:39:07.300 回答
13

发生这种情况是因为process.env强制其所有值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'

如果您需要删除环境变量,则必须delete

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
于 2012-04-22T04:40:50.123 回答