Node.js + mongoose如何解决RangeError:超出最大调用堆栈大小?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (401)

我是Node的新手,我正面临一个错误:

[RangeError: Maximum call stack size exceeded]

我无法解决这个问题,因为其他人的堆栈问题大部分都是stackoverflow有关节点处理数百个回调的问题,但我在这里只有3个。

首先获取(findbyid)然后更新并稍后进行保存操作!

我的代码是:

app.post('/poker/tables/:id/join', function(req,res){
var id = req.params.id;

models.Table.findById(id, function (err, table) {
    if(err) { console.log(err); res.send( { message: 'error' }); return; }

    if(table.players.length >= table.maxPlayers ) {
        res.send( { message: "error: Can't join ! the Table is full" });
        return; 
    }
    console.log('Table isnt Full');

    var BuyIn = table.minBuyIn;
    if(req.user.money < table.maxPlayers ) {
        res.send( { message: "error: Can't join ! Tou have not enough money" });
        return; 
    }
    console.log('User has enought money');

    models.User.update({_id:req.user._id},{ $inc:{ money : -BuyIn }}, function(err, numAffected) {
        if(err) { console.log(err); res.send( { message: 'error: Cant update your account' }); return; }
        console.log('User money updated');


        table.players.push( {userId: req.user._id, username: req.user.username, chips:BuyIn, cards:{}} );


        table.save(function (err) {
            if(err) { console.log(err); res.send( { message: 'error' });return; }           

            console.log('Table Successfully saved with new player!');
            res.send( { message: 'success', table: table});

        });
    });

})});

错误发生在最后的保存操作过程中!

我使用MongoDb,所以'Table'和'User'是我的数据库集合。

这是从我的第一个项目与nodejs,expressjs和mongodb,所以我可能在异步代码

我试图用更新替换保存:

models.Table.update({_id: table._id}, { '$push': { players : {userId: req.user._id, username: req.user.username, chips:BuyIn, cards:{}} } }, function(err,numAffected) {

                if(err) { console.log(err); res.send( { message: 'error' });return; }           

                console.log('Table Successfully saved with new player!');
                res.send( { message: 'success', table: table});


            });
提问于
用户回答回答于

有几种方法可以调试nodejs应用程序

内置调试器

要放置断点,只需放在debugger;你想要破解的地方。正如你所说的table.save回调给你带来麻烦,你可以在该功能中加入一个断点。

然后在启用调试器的情况下运行节点:

node debug myscript.js

调查堆栈

用户回答回答于

我也一直在传递这个问题。基本上,当你有一个属性ref,并且你想在查找中使用它时,你不能传递整个文档。

例如:

Model.find().where( "property", OtherModelInstance );

这会触发该错误。

但是,现在有两种方法可以解决此问题:

Model.find().where( "property", OtherModelInstance._id );
// or
Model.find().where( "property", OtherModelInstance.toObject() );

这可能暂时停止你的问题。

扫码关注云+社区

领取腾讯云代金券