ошибка nodejs firebase RangeError: сбой превышен максимальный размер стека вызовов

У меня ошибка 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);
    }
});

person noam aghai    schedule 26.01.2017    source источник


Ответы (2)


Вы обновляете тот же узел, который читаете. Это заставляет снова запускать обратный вызов 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);
    }
person Frank van Puffelen    schedule 26.01.2017
comment
Спасибо, Фрэнк, мне это тоже помогло, я делал то же самое, последние 3 дня застрял. - person gegobyte; 09.04.2017

Я столкнулся с той же ошибкой

Ошибка:

Unhandled error RangeError: Maximum call stack size exceeded
    at Function.isNull (/srv/node_modules/lodash/lodash.js:11949:20)
    at encode (/srv/node_modules/firebase-functions/lib/providers/https.js:154:11)
    at /srv/node_modules/lodash/lodash.js:13401:38
    at /srv/node_modules/lodash/lodash.js:4905:15
    at baseForOwn (/srv/node_modules/lodash/lodash.js:2990:24)
    at Function.mapValues (/srv/node_modules/lodash/lodash.js:13400:7)
    at encode (/srv/node_modules/firebase-functions/lib/providers/https.js:179:18)
    at arrayMap (/srv/node_modules/lodash/lodash.js:639:23)
    at Function.map (/srv/node_modules/lodash/lodash.js:9554:14)
    at encode (/srv/node_modules/firebase-functions/lib/providers/https.js:173:18)

Моя вызываемая функция:

exports.addRequest = functions.https.onCall((data, context) => {
    return admin.firestore().collection('requests').add({
        text: data.text,
        upvotes: 0,
    });
}); 

Я решил это, изменив версию пакета node в functions/package.json с 8 на 10, и теперь он работает нормально.

person Muhammad Habib    schedule 28.04.2020
comment
Это решило проблему, потратил много времени на эту проблему - person Rohan Kandwal; 28.06.2020