Подтвердить что ты не робот

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});


            });

Но это не помогает, ошибка все еще идет, и я не знаю, как ее отладить:/

4b9b3361

Ответ 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);