Javascript process.env.VARIABLE在分配字符串后变为未定义
我在Windows中使用Mocha和Node运行测试,环境变量显示出一种奇怪的行为。查看下面的代码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
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
是一个巨大的普通对象。我怀疑这就是问题所在