簡體   English   中英

當 function 循環時,如何修復“函數返回未定義、預期 Promise 或值”錯誤

[英]How to fix “Function returned undefined, expected Promise or value” error when function loops

我有一個我開發的 android 應用程序,它允許用戶注冊。 I wrote a firebase cloud function that triggers when a User is created, to generate a 5-digit random integer value for the user who just signed up and it stores the generated code in firebase real time database in the following structure.

MainProject
     |
     |-Codes
         |-UniqueUID_1
                |-code:72834
         |-UniqueUID_2
                |-code:23784

為了確保代碼生成在后端,我部署的 function 如下所示。 有一個值“ checker ”被初始化為 0。我使用這個值來確定何時退出 while 循環。 基本上我希望 function 生成一個 5 位數的隨機值,然后檢查實時數據庫,如果該生成的值存在於“代碼”下的所有條目中,然后如果它不存在,則將 append 到相關 UID 下的代碼中。 如果存在,則checker保持為零並且循環繼續。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

var checker = 0;
exports.createUserCode = functions.auth.user().onCreate(event => {

    while (checker == 0){
        var newRand = getUserCode(89999,10000);
        var userObject = {
            uCode : newRand
        };
        //run a db query to strategically check value generated
        return admin.database().ref("Codes/").orderByChild("uCode").equalTo(newRand).once("value",snapshot => {
            if (!snapshot.exists()){
                checker = 1;
                //add uCode into respective uid slot under Codes
                console.log(""+newRand+" : "+event.uid);
                return admin.database().ref('Codes/' + event.uid).set(userObject);

            }else{
                checker = 0;
                console.log("uCode "+newRand+" exists");
                console.log("uCode generation failed for: "+event.uid);
            }
        });
    }
});

function getUserCode(size, add){
    return Math.floor(Math.random()*size+add);
}

我測試了它,它工作得很好。 我以為問題解決了。 但是,在第 7 到第 11 次試驗中,它給了我一個Function 返回未定義、預期 Promise 或值錯誤。 過了一會兒我又試了一次,它生成的代碼很好。 其他人對其進行了測試,並帶來了同樣的錯誤。

如何解決此問題以確保它始終有效? 提前致謝。

我真的不清楚這個 function 應該做什么,頂級的 while 循環對我來說沒有意義。 但是,我可以看到這段代碼正在做的事情有一些問題。

首先,它過於依賴全局 state checker 對於所有 function 調用,此值將不一致,因為它們都不會在同一個服務器實例上運行。 每個正在運行的服務器實例都會看到不同的checker值。 觀看此視頻系列,了解有關 Cloud Functions 如何運行代碼的更多信息。

其次,當 function 啟動時checker的值為 1 時,function 將完全按照錯誤消息的內容執行 - 它將返回未定義。 通過閱讀代碼應該很容易看出這是如何發生的。

為了解決這個問題,我建議首先明確描述這個 function 在調用時應該做什么。 另外,我強烈建議消除對全局變量的依賴,除非您絕對確定您了解自己在做什么以及它們的影響。

不久前我遇到了同樣的問題。 ESLint 不允許 function 完成,因為它評估代碼的每個部分是否返回 promise。 從我可以看到 if 的第一部分確實返回了一些東西。 嘗試在 else 塊中返回 boolean。

if (!snapshot.exists()){
                checker = 1;
                //add uCode into respective uid slot under Codes
                console.log(""+newRand+" : "+event.uid);
                return admin.database().ref('Codes/' + event.uid).set(userObject);

            }else{
                checker = 0;
                console.log("uCode "+newRand+" exists");
                console.log("uCode generation failed for: "+event.uid);
return false;
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM