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;
};

画像1

上記ログのように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;
};

画像2

つまり、常に同じ結果が必要なものはグローバル変数として記述して、毎回違う結果が必要なものはローカル変数として記述する必要があるということかな。

ちなみにドキュメントに書いてある通り、再利用しないときもあるので注意。実測ベースだと、一日一回しか実行されない関数の場合は再利用されないっぽい。

この記事が気に入ったらサポートをしてみませんか?