Firebaseクラウド関数を初めて使用するので、Firestoreに保存されているコレクションをフィールドごとに注文してから、コレクションの各ドキュメントに「位置」を書き込みます(これは60分ごとに発生するはずです)。Stackoverflowからのドキュメントといくつかの提案を読んだ後、私は次のアプローチを試しました。
exports.scheduledFunctionPosition = functions.pubsub.schedule('every 60 minutes').onRun((context) => {
return admin.firestore().collection("example")
.orderBy("number", "desc")
.get()
.then(querySnapshot => {
if (!querySnapshot.empty) {
for(let i =0;i<querySnapshot.size;i++){
var queryDocumentSnapshotTmp = querySnapshot.docs[i];
queryDocumentSnapshotTmp.ref.update({'position':i+1});
}
return null;
} else {
console.log("");
return null;
}
});
プログラミングのスキルがあまり良くないので簡単にやってみましたが、非同期プログラミングには問題があると思います。このコードは、番号が最も大きいドキュメントに最適です。ただし、ドキュメントが多すぎる場合、この関数は最後のドキュメントを更新しません。これに対する解決策はありますか?
これ.update()
も非同期です。を使用する.then()
かに切り替えるかにかかわらず、おそらくそれを待つ必要がありますasync/await
。私の個人的なスタイルは次のように書きます:
exports.scheduledFunctionPosition = functions
.pubsub
.schedule('every 60 minutes')
.onRun(async (context) => {
//will be returning a PROMISE
let QuerySnapshot = await admin.firestore().collection("example")
.orderBy("number", "desc")
.get();
return QuerySnapshot.empty
? (console.log(""), Promise.resolve(null))
: Promise.all( //Promise.all waits for all promises in an array to complete
//returns an array, but we use it for the array of promises
QuerySnapshot.docs.map(async (doc, index) => {
return doc.ref.update({'position':index+1}) //returns a promise
});
});
Promiseを返すと、関数は操作が完了するのを確実に待機します。
また、CloudFunctionsには厳しい時間制限があることに注意してください-デフォルトは60秒です。レコードが多すぎるとタイムアウトになる可能性があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加