我無法理解如何正確結束 Firestore 觸發器。從我從this和this中讀到的內容看來,如果沒有異步代碼(例如在不滿足條件時快速結束),您似乎應該只回傳 null 來結束函式。當我在下面的場景中回傳 null 時,它似乎作業正常。對于我正在做的事情,我錯過了更好的做法嗎?
我需要記錄我自己的自定義錯誤訊息,這就是我需要捕獲的原因。我知道我可以在這里回傳 Promise.all 而不是在 try 塊中回傳 null,但這只是我的場景的 sudo 代碼。
export const delacc = functions.auth.user().onDelete(async (user) => {
const userUID = user.uid;
try{
await admin.firestore().collection("users").doc(userUID).delete();
await admin.firestore().collection("spam").doc(userUID).delete();
await admin.firestore().collection("photos").doc(userUID).delete();
return null;
}catch(error){
functions.logger.error(error)
return null
}
});
uj5u.com熱心網友回復:
回傳 null 沒有硬性要求。事實上,異步函式總是回傳一個 Promise,無論你在函式內部做什么。它回傳的承諾基于您在處理期間等待的任何其他承諾的完成。即使您顯式回傳 null,該函式實際上仍然只是回傳一個立即以 null 值實作的承諾。它對最終結果沒有影響,因為 Cloud Functions onDelete 觸發器不會以任何方式使用已實作的值。重要的是該函式確實回傳了一個承諾,表明所有作業何時完成(并且,正如我所說,如果您在所有異步作業的函式內正確使用 await ,異步函式總是這樣做)。
當你不使用 async/await 時,我建議程式員總是回傳一個 promise,如果沒有 async work 則回傳 null。null 有一種明確的方式告訴代碼的讀者,您不打算讓 Cloud Functions 在完全終止函式之前等待任何異步作業。它還有助于滿足 eslint 或 TypeScript 警告,它們會建議你應該回傳一些東西。價值本身并不重要——它是你與其他人就你的功能的終止進行交流的內容。如果您與他人合作,代碼可讀性很重要。
uj5u.com熱心網友回復:
我要做的是使洗掉操作成為原子操作——洗掉所有檔案或一個都不洗掉——并回傳批處理回傳的承諾,因為在這個函式中沒有執行任何其他任務(這讓我認為回傳null不是' t 必要的抽象)。如果批處理拋出錯誤,則向客戶端拋出一個新的 HTTPS 錯誤(以及批處理錯誤),該錯誤 (a) 自動終止云功能,并且 (b) 為客戶端提供要評估的批處理錯誤,這取決于原因,可能會向最終用戶保證重試或錯誤訊息。
export const delacc = functions.auth.user().onDelete(async (user) => {
const userUID = user.uid;
const db = admin.firestore();
const batch = db.batch();
try {
batch.delete(db.collection("users").doc(userUID));
batch.delete(db.collection("spam").doc(userUID));
batch.delete(db.collection("photos").doc(userUID));
const writeResult = await batch.commit();
return writeResult;
} catch(error) {
functions.logger.error(error);
throw new functions.https.HttpsError("unknown", "batch-error", error);
}
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/446125.html
標籤:javascript 节点.js 火力基地 谷歌云火库 谷歌云功能
