web-dev-qa-db-ja.com

nodejs firebaseエラーRangeError:最大コールスタックサイズが失敗を超えました

Firebaseからエラーが発生しました:

FIREBASE警告:ユーザーのコールバックによって例外がスローされました。 RangeError:最大コールスタックサイズを超えました

間違いは見つかりませんでした。

私はここでとても迷っています、助けてください。

私のコードは次のようになります:

app.post('/updateCoords', (req, res)=>{
    var usrID = req.body.id;
    var usrCoords = {
        lat: req.body.lat,
        long: req.body.long
    }
    console.log('userID : '+usrID+' lat : '+usrCoords.lat+' long : '+usrCoords.long);
    var ref = database.ref('users');
    try{
        ref.orderByChild('username').equalTo(usrID).on("value", (snapshot)=> {
            if(!snapshot.val()){
                // Error
                return res.json({msg: 'username is not in D.B', success: false});
            }
            // Success
            admin.database().ref('users/' + usrID + '/currentLocation').update({
                lat: usrCoords.lat,
                long: usrCoords.long
            });
            return res.json({msg: 'user coords changed', success: true});
        });
    }catch(ex){
        console.log('ex /updateCoords = '+ex);
    }
});
12
noam aghai

読んでいるのと同じノードを更新しています。これにより、_on("value"_コールバックが再度トリガーされます。次に、新しい値を書き込みます。これにより、コールバックが再度トリガーされます。そして、それはランタイムがコールスタックスペースを使い果たすまで続きます。

最も簡単な解決策は、once()の代わりにon()を使用することです。

_   var ref = database.ref('users');
    try{
        ref.orderByChild('username').equalTo(usrID).once("value", (snapshot)=> {
            if(!snapshot.val()){
                checker = true;
            }

            if(snapshot.val()){
                admin.database().ref('users/' + usrID + '/currentLocation').update({
                    lat: usrCoords.lat,
                    long: usrCoords.long
                });
                return res.json({msg: 'user coords changed', success: true});
            //  checker = false;
            }


            // res.json({msg: 'username is not in D.B', success: false});

        });
    }catch(ex){
         console.log('ex /updateCoords = '+ex);
    }
_
15