Javascript process.env.VARIABLE在分配字符串后变为未定义

Javascript process.env.VARIABLE在分配字符串后变为未定义,javascript,node.js,environment-variables,Javascript,Node.js,Environment Variables,我在Windows中使用Mocha和Node运行测试,环境变量显示出一种奇怪的行为。查看下面的代码 var stringMock = JSON.stringify(mock); process.env.MOCKS = stringMock; if(stringMock !== process.env.MOCKS) { console.log('typeof stringMock: ', typeof stringMock); console.log('typeof process

我在Windows中使用Mocha和Node运行测试,环境变量显示出一种奇怪的行为。查看下面的代码

var stringMock = JSON.stringify(mock);
process.env.MOCKS = stringMock;
if(stringMock !== process.env.MOCKS) {
    console.log('typeof stringMock: ', typeof stringMock);
    console.log('typeof process.env.MOCKS: ', typeof process.env.MOCKS);
}
if
语句的计算结果为
true
,这已经很奇怪了,但是日志的结果是:

    typeof stringMock: string
    typeof process.env.MOCKS: undefined
这怎么可能呢?如果有人在Codeship Linux中运行了这段代码,那么这种情况就不会发生,所以可能是Windows的节点错误


我怀疑Node对env变量的字符串大小有某种限制,但我找不到任何有用的内容。

process.env
值被隐式转换为字符串。例如:

> console.log('typeof process.env.MOCKS: ', typeof process.env.MOCKS);
typeof process.env.MOCKS:  undefined

> process.env.MOCKS = undefined
undefined
> process.env.MOCKS
'undefined'
> console.log('typeof process.env.MOCKS: ', typeof process.env.MOCKS);
typeof process.env.MOCKS:  string

因此,如果您试图严格地
返回未定义的内容,您将最终将字符串
'undefined'
分配给
process.env.MOCKS

真正的问题是:

  • mock
    值是多少
  • stringMock
    值是多少
  • process.env.mock
    值是多少
  • 只有类型只是数据的一部分

    我可以想象,
    mock
    只有一个值会使
    stringMock!==process.env.mock
    计算为true,即
    未定义
    。这是因为
    JSON.stringify()
    将返回
    undefined
    而不是字符串,然后
    undefined
    将在保存到环境变量中时得到stringify

    但奇怪的是,这个程序的输出:

    var mock = undefined;
    
    var stringMock = JSON.stringify(mock);
    process.env.MOCKS = stringMock;
    if(stringMock !== process.env.MOCKS) {
        console.log('typeof stringMock: ', typeof stringMock);
        console.log('typeof process.env.MOCKS: ', typeof process.env.MOCKS);
    }
    
    与你得到的完全相反:

    typeof stringMock:  undefined
    typeof process.env.MOCKS:  string
    
    这是因为
    undefined
    值中的第一个是字符串
    “undefined”
    。但是这里你有相反的结果,这很奇怪,坦白说,我无法为我尝试过的任何值重现你的结果,比如
    NaN
    Infinity
    0
    '
    ,等等。序列化为JSON的所有其他内容都应该返回一个字符串(在env var中是相同的)或引发异常(例如循环引用)

    我想到的唯一提示是达到操作系统的某些长度限制,比如试图保存一个很长的字符串,结果根本没有将该字符串保存到环境中

    现在,当我想到它时,我搜索了它,似乎Windows上有32K字符的限制,请参见:

    环境变量的理论最大长度约为32760个字符。然而,你不可能在实践中达到理论上的最大值

    尝试打印
    stringMock.length
    ,它可能会回答您的问题。

    如所述,问题与字符串的长度有关。有时
    stringMock
    包含超过40k个字符

    process.env.MOCKS = stringMock.substr(0, 30000);
    console.log(process.env.MOCKS); // prints the string
    
    process.env.MOCKS = stringMock.substr(0, 40000);
    console.log(process.env.MOCKS); // prints undefined
    

    mock
    var的值是多少?哪个节点版本?
    node v6.11.0
    mock
    是一个巨大的普通对象,字符串版本有超过40k个字符。如果输入是
    undefined
    ,我很惊讶您会得到任何输出,因为
    stringMock
    processMock
    都将是“undefined”。条件永远不会满足。不,这是正确的输出,请严格检查
    stringMock.length
    有超过40k个字符,因为
    mock
    是一个巨大的普通对象。我怀疑这就是问题所在