Node.js + mongoose [RangeError: превышен максимальный размер стека вызовов]
Я новичок в Node, и я столкнулся с ошибкой:
[RangeError: превышен максимальный размер стека вызовов]
Я не могу решить проблему, потому что большинство проблем стека в других вопросах stackoverflow о Node имеет дело с сотнями обратных вызовов, но у меня здесь всего 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, поэтому "Таблица" и "Пользователь" являются моими коллекциями баз данных.
Это из моего первого проекта с nodejs, expressjs и mongodb, поэтому я, вероятно, совершил огромные ошибки в асинхронном коде: (
EDIT: я попытался заменить сохранение на обновление:
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});
});
Но это не помогает, ошибка все еще идет, и я не знаю, как ее отладить:/
Ответы
Ответ 1
Я тоже пробовал эту проблему.
В принципе, когда у вас есть свойство с ref
, и вы хотите использовать его в поиске, например, вы не можете передать весь документ.
Например:
Model.find().where( "property", OtherModelInstance );
это приведет к ошибке.
Однако у вас есть 2 способа исправить это сейчас:
Model.find().where( "property", OtherModelInstance._id );
// or
Model.find().where( "property", OtherModelInstance.toObject() );
Это может остановить ваши проблемы на данный момент.
В их реестре GitHub есть проблема, о которой я сообщил об этом, но пока это не исправлено. См. здесь проблему.
Ответ 2
Существует несколько способов отладки приложений nodejs
Встроенный отладчик
Отладчик Node.js описан здесь: http://nodejs.org/api/debugger.html
Чтобы разместить точки останова, просто поместите debugger;
в место, которое вы хотите сломать. Как вы сказали, обратный вызов table.save
дает вам проблемы, вы можете поставить точку останова внутри этой функции.
Затем вы запустите node с включенным отладчиком:
node debug myscript.js
И вы получите более полезный вывод.
Исследование стека
Вы также можете использовать console.trace
для печати stacktrace, если у вас есть хорошая идея о том, когда/где вы сталкиваетесь с проблемами, и хотите выяснить, как вы туда попали.
Удачи, надеюсь, это поможет!
Ответ 3
Я продолжал получать эту ошибку и, наконец, понял это. Это очень сложно отладить, поскольку в ошибке не указана реальная информация.
Оказывается, я пытался сохранить объект в поле. Сохранение только определенного свойства объекта, или JSON, строящего его, работало как шарм.
Кажется, было бы неплохо, если бы водитель дал более конкретную ошибку, но хорошо.
Ответ 4
MyModel.collection.insert
вызывает:
[RangeError: превышен максимальный размер стека вызовов]
Когда вы передаете массив экземпляров 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);