概要
普段、Node.jsでExpressを使用したAPIを開発をしているのだが、config機能の取り扱いでこれはやべえって思った内容があったので備忘ついでに残すことにした。
事象
ある操作をすると、本来は変更が加わってはいけないはずのconfigの中身が変更されてしまう。
変更されたconfigの中身はExpressを再起動しない限り元には戻らない。
発現方法
呼び出したconfigの中身を入れ替えてやればいい。
import config from 'config'
const pollutionConfig = () => {
config.aaa = "pollution"
}
export default pollutionConfig;
config/sample.js
module.exports = {
"aaa":[
111,
222,
333,
{
"sample1": 12345,
"sample2": 67890
}
],
"bbb":[
111,
222,
333,
{
"sample1": 12345,
"sample2": 67890
}
]
}
configの中身は値渡しで渡ってくるわけではなく内部的に値をクローンしてくれるわけでもないようなので、この結果は当然のことらしい。
それでも基本的なこととして、configの内容が書き変わるとかないでしょ。
ならばどうするか
ディープコピーしようぜ。
import config from 'config'
const safetyConfig = () => {
const c = JSON.perse(JSON.stringify(config))
c.aaa = "OK"
}
export default safetyConfig;
これなら大元のグローバル領域が変更されることはない。
ディープコピーの方法はいくつかあるが、JSONデータは配列と連想配列が入り乱れることも多いため、一旦stringifyした上でperseしなおすのが一番手っ取り早いと思う。
場合によっては、これは共通処理化してしまってもいいかもしれない。
パフォーマンスに関しては知らん。
↧