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 一起使用,所以 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
);
);
但这无济于事,错误仍然来了,我不知道如何调试它:/
【问题讨论】:
请将您的答案放在答案部分。 并不是说它会导致堆栈大小问题,但这条线肯定看起来不对:if(req.user.money < 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: 超出最大调用堆栈大小]的主要内容,如果未能解决你的问题,请参考以下文章
??? MongoDB ??? Node.js ????????? Mongoose ??
Node.js:如何在 mongoose.js 中执行 count 命令?