19

我是 Node.js 的新手,我遇到了一个错误:

RangeError:超出最大调用堆栈大小

我无法解决这个问题,因为其他有关 Node.js 的 stackoverflow 问题中的大多数堆栈问题都涉及数百个回调,但我这里只有 3 个。

首先是 fetch ( 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 与 mongoose 一起使用,Table并且User是我的数据库集合。

这是我第一个使用 Node.js、Express.js 和 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
    });

});

但这无济于事,错误仍然存​​在,我不知道如何调试它:/

4

4 回答 4

22

I've been passing for this problem too. Basically, when you have a property with a ref, and you want to use it in a find, for example, you can't pass the whole document.

For example:

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

this will trigger that error.

However, you have 2 ways to fix this for now:

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

This may stop your problems for now.

There is a issue in their GitHub repo where I reported this, however it's without fix for now. See the issue here.

于 2013-02-22T02:05:01.583 回答
5

我一直收到这个错误,终于弄明白了。由于错误中没有提供真实信息,因此很难调试。

原来我试图将一个对象保存到一个字段中。只保存对象的特定属性,或者将它的 JSON 字符串化,就像一个魅力。

如果驱动程序给出更具体的错误似乎会很好,但是哦,好吧。

于 2014-06-30T02:07:53.310 回答
4

MyModel.collection.insert原因:

[RangeError: 超出最大调用堆栈大小]

当您传递实例数组MyModel而不是仅传递具有该对象值的数组时。

范围错误:

let myArray = [];

myArray.push( new MyModel({ prop1: true, prop2: false }) );

MyModel.collection.insert(myArray, callback);

没有错误:

let myArray = [];

myArray.push( { prop1: true, prop2: false } );

MyModel.collection.insert(myArray, callback);
于 2015-10-08T16:12:29.820 回答
3

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

内置调试器

Node.js 调试器记录在这里:http ://nodejs.org/api/debugger.html

要放置断点,只需放置debugger;在要中断的位置即可。正如您所说的table.save回调给您带来麻烦,您可以在该函数中放置一个断点。

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

node debug myscript.js

你会得到更多有用的输出。

调查堆栈

console.trace如果您对遇到问题的时间/地点有一个很好的了解,并且想弄清楚您是如何到达那里的,您还可以使用它来打印堆栈跟踪。

祝你好运,我希望这会有所帮助!

于 2012-08-30T01:35:40.603 回答