2017-10-13 3 views
0

編集:これは "res.json(comment);"という行にぶら下がっている私の角度uiルートの。まだわからない平均スタック:最初のオブジェクトがMongoDBスキーマの配列にプッシュされるとRangeErrorが発生する

ここでは、チュートリアルの次の通りです:https://thinkster.io/tutorials/mean-stack。これはチュートリアルが少し古くなっているという事実に関連しているかもしれません。現在の状態で自分のコードをアップロードしましたhttp://github.com/orieporter/flappernews

これは、リンク、コメント、およびアップポストを投稿するためのシンプルなredditクローンウェブアプリです。投稿に最初のコメントを追加するたびに、「RangeError:最大呼び出しスタックサイズを超えました」というエラーが表示されます。それ以降のコメントは問題ありません。ノードサーバーを再起動してページをリロードすると、サーバーを壊したコメントが表示されます。誰も私がここで問題を見つけるのを助けることができますか?

全エラー:

events.js:160 
    throw er; // Unhandled 'error' event 
    RangeError: Maximum call stack size exceeded 
at model.Document.$toObject (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\document.js:1962:24) 
at model.Document.toJSON (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\document.js:2300:15) 
at clone (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\utils.js:252:18) 
at cloneArray (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\utils.js:362:14) 
at clone (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\utils.js:247:12) 
at cloneObject (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\utils.js:343:13) 
at clone (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\utils.js:260:16) 
at model.Document.$toObject (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\document.js:2009:13) 
at model.Document.toJSON (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\document.js:2300:15) 
at clone (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\utils.js:252:18) 
at cloneObject (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\utils.js:343:13) 
at clone (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\utils.js:260:16) 
at model.Document.$toObject (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\document.js:2009:13) 
at model.Document.toJSON (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\document.js:2300:15) 
at clone (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\utils.js:252:18) 
at cloneArray (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\utils.js:362:14) 
at clone (c:\Users\source\repos\flapper-news\node_modules\mongoose\lib\utils.js:247:12) 

関連HTML:

<form ng-submit="addComment()" style="margin-top:30px;"> 
    <h3>Add a new comment</h3> 
    <div class="form-group"> 
     <input type="text" class="form-control" placeholder="Comment" ng-model="body"></input> 
    </div> 
    <button type="submit" class="btn btn-primary">Post</button> 
</form> 

角度コントローラ機能:

$scope.addComment = function() { 
    if ($scope.body === '') { return; } 
    posts.addComment(post._id, { 
     body: $scope.body, 
     author: 'user' 
    }, 
    $scope.post); 
    $scope.body = ''; 
}; 

角度ファクトリ関数:

o.addComment = function (id, comment, post) { 
    return $http.post('/posts/' + id + '/comments', comment).then(function (response) { 
     post.comments.push(response.data); 
     return response.data; 
    }); 
}; 

関連エクスプレスルート:

router.post('/posts/:post/comments', function (req, res, next) { 
    var comment = new Comment(req.body); 
    comment.post = req.post; 

    comment.save(function (err, comment) { 
     if (err) { return next(err); } 

     req.post.comments.push(comment); 
     req.post.save(function (err, post) { 
      if (err) { return next(err); } 

      res.json(comment); 
     }); 
    }); 
}); 

コメントスキーマ:

var CommentSchema = new mongoose.Schema({ 
    body: String, 
    author: String, 
    upvotes: {type: Number, default: 0}, 
    post: {type: mongoose.Schema.Types.ObjectId, ref: 'Post' } 
}); 

ポストスキーマ:

var PostSchema = new mongoose.Schema({ 
    title: String, 
    link: String, 
    upvotes: {type: Number, default: 0}, 
    comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }] 
}); 
+0

コメントはここには保存されていません: 'comment.post = req.post;' bcリクエストに 'post'属性がありません。それは 'エラー 'として返答しようとしていますが、あなたはそこに返答していません、ただ関数を返しました。あるいは 'next(err)'コールを受け取っている別のルートがありますか? – bazzells

+0

ルートファイルの別の部分のパラメータから投稿を取得します。私はreq.postを問題なくコンソールに印刷でき、うまく見えます。 comment.postをreq.postに設定すると、自分のコメントをコンソールに表示できなくなります。そして、このすべては、私が投稿に行った最初のコメントにのみ適用されます。 – orieporter

答えて

0

のようなものでres.json(comment);を交換する必要があります(数楽しい時間を!)コンソールログのデバッグ、Googleの検索、およびthinksterたるみ髪のは、何が起こっていたのか把握しようとする。気にして、私はこのすべてを初めて知ったので、すべてのことを頭で包み込むことがおそらく最大の課題でした。

さらに調査すると、新しいコメントルートの作成ロジック(routes/index.js)に対しても、res.json(comment)行の原因が絞り込まれました。

論理的には、コメントオブジェクト全体が必要なときに投稿コメント配列にプッシュされていた理由は分かりませんでした。当然、私は最終的になぜコメントオブジェクトID(comment._id)を渡して何が起こるかを理解していないのが分かりました。そしてwallah、それは働いた。もはやRangeError: Maximum call stack size exceeded

これは問題を解決するかもしれませんが、私の不思議な頑固な自己は、どうして問題なのか知りたいですか?なぜそれは投稿の最初のコメントでのみ起こるのですが、他の投稿ではうまくいくのですか?

router.post('/posts/:post/comments', auth, function(req, res, next) { 
    var comment = new Comment(req.body); 
    comment.post = req.post._id; // <-- originally 'req.post' 
    comment.author = req.payload.username; 

    comment.save(function(err, comment){ 
    if(err){ return next(err); } 

    req.post.comments.push(comment._id); // <-- originally 'comment' 
    req.post.save(function(err, post) { 
     if(err){ return next(err); } 

     res.json(comment); 
    }); 
    }); 
}); 

マングースはちょうどその理由だけでIDを保存しない、ポストとコメントIDと全体ではなく、オブジェクトを必要としていた場合、私は考え出し。完全なオブジェクトを格納すると、応答中にコールスタックエラーが発生すると思われる何らかの無限ループが発生しているようです。おそらく両方のオブジェクトがお互いを参照しているからでしょうか?しかし、もう一度、私はどのようにこれがすべて実際に動作するか分からないので、そこの専門家がいくつかの光を放つことができる場合、してください。しかし、それは問題に取り組むべきであり、うまくいけば他人を助けるべきです私はこれが彼らが提供する実際のFlapper Newsコードのエラーであることを言及する必要があります。完成したソースコードをダウンロードして実行していることが分かりました。

+0

ジャシュアに感謝、これが私を助けたのです。投稿とコメントのドキュメントの循環参照によって無限ループが起こっていることは間違いありません。それ以降のコメントのために動作するという事実は、過去のmongoose/mongodbのバージョンでは、コードが自動的にObjectIDをあなたが定義した場合に追加されるオブジェクトは、ObjectIDとして存在します。私はこれが古くなっているチュートリアルのもう一つのインスタンスだと思います。私はThinksterに更新を依頼したことを電子メールで送りました。 – orieporter

+0

問題はありません。私はThinksterにもメッセージを送りました。私は問題を経験した唯一の人ではなく、あなたのポストを見つけたことを嬉しく思っています。すべてのことに幸運。 –

0

res.json(comment);は、あなたが作成したコメントオブジェクトのインスタンスを文字列化しようとしているからですvar comment = new Comment(req.body);

しかし、「文字列化」プロセスは、Comment Objectのサイズが大きすぎて文字列化する必要がないため、明らかにハングしています。

あなたは、私は同じ問題を抱えて、私にビットを取った

res.json({ status: "success" });

+0

他のオブジェクトにres.json()を使用しても問題はありません。また、同じ投稿の後のコメントでも、クラッシュを引き起こすのは最初のものだけです。 – orieporter

関連する問題