2017-09-12 13 views
0

WindowsでMochaとNodeでテストを実行していて、env変数が奇妙な動作をしています。process.env.VARIABLE文字列を割り当てた後に未定義になる

typeof stringMock: string 
    typeof process.env.MOCKS: 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); 
} 

それはすでにif文がtrueに評価されていることは非常に奇妙だが、ログの結果は以下のコードを見て? Codeship Linuxでこのコードを実行した場合、これは起こらないため、おそらくWindowsのNodeバグになる可能性があります。

私はNodeにenv変数の文字列のサイズに関する何らかの制限があると思われますが、私はそれについて有用なものを見つけることができませんでした。

+0

'mock' varの値は何ですか? – alexmac

+0

どのノードのバージョンですか? – MinusFour

+0

'ノードv6.11.0'。 'mock'は巨大な普通のオブジェクトです。文字列のバージョンは40k文字以上です。 – daymannovaes

答えて

0

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を返しますstringily何かしようとしているならば、あなたはprocess.env.MOCKSに文字列'undefined'を割り当てることになります。例えばので。

1

実際の質問は次のとおりです。

  1. mockは何ですか?
  2. stringMockとは何ですか?
  3. process.env.MOCKSとは何ですか?

データ型の一部のみがデータの一部にすぎません。

私はstringMock !== process.env.MOCKSがtrueと評価するだろうmock 1つの値だけを想像することができ、それは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値との最初の1 2番目の文字列は文字列"undefined"です。しかし、ここでは、その逆を持って、非常に奇妙であると率直に言って、私はJSONにシリアライズされた他のすべてのいずれかのはずリターンなど、''0InfinityNaNのように、私が試してみました任意の値のためにあなたの結果を再現することができませんでした文字列(env varと同じ)または例外をスローする(例えば循環参照の場合)

私の心に来るだけのヒントは、オペレーティングシステムのいくつかの長さの制限を打つことになる - 環境へのすべての文字列を保存しないで結果として非常に長い文字列を保存しようとしているような。

そして今、私はそれについて考えたとき、私はそれを検索し、Windows上で32K文字の制限がありますようです、以下を参照してください

の理論上の最大長環境変数は約32,760文字です。しかし、実際には理論上の最大値を達成する可能性は低いです。

stringMock.lengthを印刷してください。あなたの質問に答えられるかもしれません。

+0

'stringMock'と' processMock'の両方が "undefined"になるので、入力が 'undefined'の場合は出力が得られるのに驚いています。条件は決して満たされません。 – Andy

+0

いいえ、正しい出力です。[node.js docs](https://nodejs.org/api/process.html#process_process_env) – alexmac

+0

を確認してください。 'mock'は巨大な普通のオブジェクトなので、' stringMock.length'は40k文字以上です。私はこれが問題だと思う – daymannovaes

0

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 
関連する問題