node.js process.env:将 process.env 属性分配给字符串类型中的未定义结果

node.js process.env: assigning process.env property to undefined results in string type?

本文关键字:process env 类型 未定义 字符串 结果 分配 js 属性 node      更新时间:2023-09-26

node.js process.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传递空对象:字典类型。A:未定义Pass process.env:字典类型。A:字符串

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)指出的那样,你也可以从process.env delete钥匙

    delete process.env.A;
    

希望这有帮助

发生这种情况是因为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

你可以通过使用Object.defineProperty来绕过process.env的字符串强制:

Object.defineProperty(process.env, 'ENV_VAR_NAME', {
  configurable: true,
  value: nonStringValue
});

如果您以后想delete process.env.ENV_VAR_NAME,则需要configurable: true