[英]Node.js + mongoose [RangeError: Maximum call stack size exceeded]
我是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
});
});
但它仍然没有帮助错误,我不知道如何调试它:/
我也一直在试图解决这个问题。 基本上,当你有一个带有ref
的属性,并且你想在一个find中使用它时,你就无法传递整个文档。
例如:
Model.find().where( "property", OtherModelInstance );
这将触发该错误。
但是,您现在有两种方法可以解决此问题:
Model.find().where( "property", OtherModelInstance._id );
// or
Model.find().where( "property", OtherModelInstance.toObject() );
这可能暂时阻止你的问题。
他们的GitHub回购中有一个问题,我报告了这个问题,但现在还没有修复。 在这里查看问题 。
我不断得到这个错误,最后想出来了。 调试非常困难,因为错误中没有真正的信息。
结果我试图将对象保存到字段中。 只保存对象的特定属性,或者对其进行字符串化处理,就像魅力一样。
看起来如果驱动程序发出更具体的错误会很好,但是哦。
有几种方法可以调试nodejs应用程序
这里记录了Node.js调试器: http : //nodejs.org/api/debugger.html
要放置断点,只需debugger;
在你想打破的地方。 正如你所说table.save
回调给你带来麻烦,你可以在该函数中放置一个断点。
然后在启用调试器的情况下运行节点:
node debug myscript.js
而且你会得到更多有用的输出。
你也可以使用console.trace
来打印堆栈跟踪,如果你很清楚遇到问题的时间/地点,并想知道你是如何到达那里的。
祝你好运,我希望这有帮助!
MyModel.collection.insert
导致:
[RangeError:超出最大调用堆栈大小]
当您传递MyModel
实例的MyModel
而不是仅包含该对象的值的数组时。
引发RangeError:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.