【问题标题】:nodejs firebase error RangeError: Maximum call stack size exceeded failurenodejs firebase错误RangeError:超过最大调用堆栈大小失败
【发布时间】:2017-06-12 08:46:06
【问题描述】:

我有一个来自 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);
    }
});

【问题讨论】:

    标签: node.js express firebase-realtime-database firebase-admin


    【解决方案1】:

    您正在更新您正在阅读的同一节点。这会导致再次触发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);
        }
    

    【讨论】:

    • 谢谢弗兰克,这也帮助了我,我也在做同样的事情,自从过去 3 天以来一直卡住。
    【解决方案2】:

    我遇到了同样的错误

    错误:

    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,
        });
    }); 
    

    我通过将functions/package.json 中的node 包版本从8 更改为10 解决了这个问题,现在它工作正常。

    【讨论】:

    • 这解决了这个问题,在这个问题上浪费了很多时间
    猜你喜欢
    • 2018-12-08
    • 2019-07-05
    • 2014-02-07
    • 2018-06-03
    • 1970-01-01
    • 2021-09-21
    • 2014-08-19
    • 2013-08-18
    • 2015-06-28
    相关资源
    最近更新 更多