どんな問題?
Firebaseで、特定のFirestore Collection に Documentが追加されたら
複数のユーザにSendGrid経由でメールを送る処理を書いていた。
雑にコードを示すとこんな感じ
const functions = require('firebase-functions');
exports.sendEmailViaSendGrid = functions.region(functions.config().region.name).firestore.document("foo/{fooId}").onCreate(snapshot => {
//メール送信対象のメアド一覧を取得
const mailAddresses = [];
//各メールアドレスに対して、SendGrid API叩いてメール送る
mailAddresses.forEach(mailAddress => {
// 各メールアドレスに対して、SendGrid API叩く処理
});
});
ところが、これをデプロイしたところ、
メールが送られたり送られなかったりする現象が発生した。
(全件送信されるときもあれば、数件送信できてないときもあれば、全く送信できない場合もあった)
解決方法
非同期処理のHTTP通信が終わる前に実行環境がシャットダウンしているとかそういう話なのでは? 非同期のバグによくある、特定の処理が間に合う場合と間に合わない場合があるという症状な感じがします。チュートリアルのようにPromiseを返してもそんな現象になるんですか? https://t.co/gY82NyBYpo
— n (@n_1215) September 6, 2019
まさにこれでした。
以下のように修正。(これも実際のコードではなく、雑に概念だけ書いたもの)
const functions = require('firebase-functions');
exports.sendEmailViaSendGrid = functions.region(functions.config().region.name).firestore.document("foo/{fooId}").onCreate(snapshot => {
//メール送信対象のメアド一覧を取得
const mailAddresses = [];
//各メールアドレスに対して、SendGrid API叩いてメール送る
return Promise.all(mailAddresses.map(mailAddress => {
// 各メールアドレスに対して、SendGrid API叩く処理(Promiseを返す)
}));
});
ちゃんと全件にメールが飛ぶようになりました。