19

Node.js は初めてで、エラーに直面しています:

RangeError: 最大呼び出しスタック サイズを超えました

Node.jsに関する他のstackoverflowの質問のスタックの問題のほとんどは何百ものコールバックを扱っているため、問題を解決できませんが、ここには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
                });

            });
        });

    });
});

最後にセーブ操作中にエラーが発生!

私はmongooseでMongoDbを使用しているので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
    });

});

しかし、エラーがまだ発生していて、デバッグ方法がわかりません:/

4

4 に答える 4

22

私もこの問題に合格してきました。基本的に、 を持つプロパティがありref、それを検索で使用したい場合、たとえば、ドキュメント全体を渡すことはできません。

例えば:

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

これにより、そのエラーがトリガーされます。

ただし、現時点ではこれを修正する方法が 2 つあります。

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

これで問題が解決する場合があります。

私がこれを報告した GitHub リポジトリに問題がありますが、今のところ修正されていません。ここで問題を参照してください

于 2013-02-22T02:05:01.583 に答える
5

私はこのエラーを受け取り続け、最終的にそれを理解しました。エラーに実際の情報が表示されないため、デバッグが非常に困難です。

オブジェクトをフィールドに保存しようとしていたことがわかりました。オブジェクトの特定のプロパティのみを保存するか、JSON 文字列化することは魅力的に機能しました。

ドライバーがより具体的なエラーを出してくれればよかったのですが、まあまあ。

于 2014-06-30T02:07:53.310 に答える
3

nodejs アプリケーションをデバッグする方法はいくつかあります

組み込みデバッガ

Node.js デバッガーは、http: //nodejs.org/api/debugger.htmlに記載されています。

ブレークポイントを配置するには、ブレークdebugger;したい場所に置くだけです。コールバックが問題を引き起こしていると言ったようtable.saveに、その関数内にブレークポイントを配置できます。

次に、デバッガーを有効にしてノードを実行します。

node debug myscript.js

そして、より役立つ出力が得られます。

スタックの調査

console.traceいつ/どこで問題が発生したかがよくわかっていて、どうやってそこにたどり着いたかを知りたい場合は、を使用してスタックトレースを出力することもできます。

頑張ってください、これがお役に立てば幸いです!

于 2012-08-30T01:35:40.603 に答える