【问题标题】:process.env.VARIABLE going to undefined after assigning string分配字符串后 process.env.VARIABLE 将变为未定义
【发布时间】:2017-09-12 15:35:46
【问题描述】:

我在 Windows 中使用 Mocha 和 Node 运行测试,并且 env 变量显示出奇怪的行为。看下面的代码

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 错误。

我怀疑 Node 对环境变量的字符串大小有某种限制,但我找不到任何有用的东西。

【问题讨论】:

  • mock var 的值是多少?
  • 什么节点版本?
  • node v6.11.0mock 是一个巨大的普通对象,字符串版本有超过 40k 个字符。

标签: javascript node.js environment-variables


【解决方案1】:

真正的问题是:

  1. mock是多少?
  2. stringMock是多少?
  3. process.env.MOCKS是多少?

只有类型只是数据的一部分。

我可以想象mock 只有一个值会使stringMock !== process.env.MOCKS 评估为真,那就是undefined。这是因为JSON.stringify() 将返回undefined 而不是字符串,然后undefined 在保存在环境变量中时会被字符串化。

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

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"。但在这里你有相反的情况,这很奇怪,坦率地说,我无法重现你尝试过的任何值的结果,比如NaNInfinity0'' 等。其他所有序列化为 JSON 的内容都应该返回一个字符串(在 env var 中是相同的)或抛出异常(例如循环引用)。

我想到的唯一提示是达到操作系统的一些长度限制 - 比如尝试保存一个很长的字符串导致根本不将字符串保存到环境中。

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

环境变量的理论最大长度约为 32,760 个字符。但是,您在实践中不太可能达到理论上的最大值。

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

【讨论】:

  • 如果输入是undefined,我很惊讶你得到任何输出,因为stringMockprocessMock 都将是“未定义的”。条件永远不会满足。
  • 不,这是正确的输出,检查node.js docs
  • 没错。 stringMock.length 有超过 40k 个字符,因为 mock 是一个巨大的普通对象。我怀疑这是问题
【解决方案2】:

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

因此,如果您尝试 stringily 某些返回未定义的内容,您最终会将字符串 'undefined' 分配给 process.env.MOCKS

【讨论】:

    【解决方案3】:

    正如rsp 所指出的,该问题与字符串的长度有关。有时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
    

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 2014-06-05
      • 1970-01-01
      • 2020-09-16
      • 2013-02-25
      相关资源
      最近更新 更多