Node.js + mongoose [RangeError: 超出最大调用堆栈大小]

Posted

技术标签:

【中文标题】Node.js + mongoose [RangeError: 超出最大调用堆栈大小]【英文标题】:Node.js + mongoose [RangeError: Maximum call stack size exceeded] 【发布时间】:2012-05-27 12:50:03 【问题描述】:

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

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

我无法解决问题,因为其他有关 Node.js 的 *** 问题中的大多数堆栈问题都涉及数百个回调,但我这里只有 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 与 mongoose 一起使用,所以 TableUser 是我的数据库集合。

这是我第一个使用 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
    );

);

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

【问题讨论】:

请将您的答案放在答案部分。 并不是说它会导致堆栈大小问题,但这条线肯定看起来不对:if(req.user.money &lt; table.maxPlayers)。您所做的一切都没有其他问题。 您是在多次请求后出现该错误,还是在第一次请求后出现? 【参考方案1】:

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

内置调试器

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

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

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

node debug myscript.js

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

调查堆栈

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

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

【讨论】:

感谢您的回答。我不知道内置调试器的存在 - 我想如果我想检查我的代码,我必须设置节点检查器! 很高兴它成功了!如果您喜欢,请“接受”我的回答作为解决方案。【参考方案2】:

我也因这个问题而过关。 基本上,当您有一个带有ref 的属性,并且您想在查找中使用它时,例如,您不能传递整个文档。

例如:

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

这将触发该错误。

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

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

这可能会暂时解决您的问题。

我在他们的 GitHub 存储库中报告了这个问题,但目前还没有修复。 See the issue here.

【讨论】:

jup,两个月前也遇到同样的问题,修复了,但是没有记录,怎么... 现在又被我绊了一下,逼得我去搜这个帖子点赞了; -)【参考方案3】:

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

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

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

【讨论】:

在提供旧问题的答案时,有助于说明您的答案与现有答案有何不同。在这种情况下,您的答案看起来像是 gustavohenke 提供的答案的子集。【参考方案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);

【讨论】:

以上是关于Node.js + mongoose [RangeError: 超出最大调用堆栈大小]的主要内容,如果未能解决你的问题,请参考以下文章

node.js 中间件 mongoose

??? MongoDB ??? Node.js ????????? Mongoose ??

Node.js:如何在 mongoose.js 中执行 count 命令?

如何让 node.js 使用 mongoose 连接到 mongolab

Node.JS + Mongoose 回调地狱

Node.js - 使用 Mongoose 创建关系