スキップしてメイン コンテンツに移動

Firebase functionでPromiseをreturnしないとPromise内の処理が不安定になる

Node.jsでfirebase functionsを開発していると、Promiseを使う場面が多いと思いますが、Promiseをfunctionでreturnしないと、functionの処理に非常に時間がかかったり、処理が非常に不安定になるようです。

const myPromise = new Promise((resolve, reject) => {
// なんか処理
});

// myProimise内での処理とは無関係にfunctionのレスポンスを返す。→ 不安定
exports.notReturnPromise= functions.https.onCall((data, context) => {
  myPromise.then(() => {
  });
  return {"code": "success"};
});

// myProimise内での処理が終わったらfunctionのレスポンスを返す。→ レスポンスは遅くなるが安定
exports.returnPromise= functions.https.onCall((data, context) => {
  return myPromise.then(() => {
    return {"code": "success"};
  });
});

筆者の環境ではPromiseをreturnしなかった場合、下記のような不具合が多発しました。

  • Cloud Storageへのアップロードに時間がかかったり、SSLの認証で落ちる
  • firestoreのtransaction処理でエラーが多発
    • timeout
    • transaction missingなどなど

functionでPromiseをreturnするようにしたところ、上記の問題は発生しなくなりました。
functionはPromiseがresolveされるまで、レスポンスを返さないので、Promiseのresolveに時間がかかる処理がある場合、funtionがレスポンスを返すのも時間がかかるようになります。Promiseのresolveを待たないでfirebase functionをreturnすることで、function自体のレスポンスを早く返すことを期待しましたが、Promise内(Promise Chain)の処理が不安定になり、使い物になりませんでした。

コメント