Cloud Functions でグローバル変数は再利用される
Node.js 10で以下のようにその時の日時を取得して変数に入れるときに、この部分が実行毎に変更されない事象が起こった。
javascript自体がほとんどかけないので、コードに変なところあったら教えてください。(たぶんvarは使わない方がいい?)
const { exec } = require('child_process');
require('date-utils');
var dt = new Date(new Date().toLocaleString('ja-JP', { timeZone: 'Asia/Tokyo' }));
var formatted = dt.toFormat("YYYYMMDDHH24MISS");
exports.exec = async (message, context) => {
try {
console.log("日時:" + formatted);
} catch (e) {
console.error(e);
}
return;
};
上記ログのようにformattedは異なるジョブとして呼び出されているにもかかわらず、値が変わっていない。
これはおそらく、以下のドキュメントに書かれている「グローバル変数を使用して将来の呼び出しでオブジェクトを再利用する」ことかと思われる。
つまり、グローバル変数にしなければ再利用されないはず。
というわけで、以下のようにプログラムを変更したところ想定通り動いた。
const { exec } = require('child_process');
require('date-utils');
exports.exec = async (message, context) => {
try {
var dt = new Date(new Date().toLocaleString('ja-JP', { timeZone: 'Asia/Tokyo' }));
var formatted = dt.toFormat("YYYYMMDDHH24MISS");
console.log("日時:" + formatted);
} catch (e) {
console.error(e);
}
return;
};
つまり、常に同じ結果が必要なものはグローバル変数として記述して、毎回違う結果が必要なものはローカル変数として記述する必要があるということかな。
ちなみにドキュメントに書いてある通り、再利用しないときもあるので注意。実測ベースだと、一日一回しか実行されない関数の場合は再利用されないっぽい。
この記事が気に入ったらサポートをしてみませんか?