3

私は、エンドポイントが呼び出されるたびに増分番号を返すHTTPトリガー機能を持っています。コードは次のようになります。関数の実行順序を確実にする方法は?

export const reserve = functions.https.onRequest((req, resp) => { 
    cors(req, resp, async() => { 
    if (req.method.toLowerCase() !== 'post') { 
     resp.status(405); 
     resp.end(); 
    } else { 
     const path = `counter`; 
     const ref = firebase.database().ref(path); 
     const oldCount = (await ref.once('value')).val(); 
     await ref.set(oldCount + 1); 
     resp.status(200).send({ 
     number: oldCount 
     }); 
     resp.end(); 
    } 
    }); 
}); 

問題がある2つの呼び出しが互いに非常に接近している場合、機能は同じ番号を返すことができるという可能性はありますか?もしそうなら、これを防ぐ方法はありますか?

+0

同じ番号を付与することが可能となることができるようにJavaScriptがシングルスレッドであるため。 –

答えて

2

はい、そうですが、このような問題がある可能性があります。私はfirebaseに精通していませんが、最初にフェッチしなくてもfirebaseの番号を直接インクリメントできるようなものを探します。これはアトミックな操作であり、記述した問題に遭遇しないことを保証します。

firebaseではこれが不可能な場合は、途中で何らかの形でカウンタの記録を保持するサーバをセットアップする必要があります。番号をインクリメント/デクリメントするたびに、要求はサーバーを経由してキャッシュ上で操作を実行した後、Firebase APIを呼び出してリクエストを完了します。

アップデート:ここで 方法Firebase recommends thisです:

ref.transaction(function (current_value) { 
    return (current_value || 0) + 1; 
}); 
関連する問題