在帖子中添加新评论时,“超出了最大调用堆栈大小”

时间:2019-08-18 19:32:23

标签: javascript node.js mongodb express mongoose

我正在尝试通过遵循这里的指南来学习MEAN堆栈基础:https://thinkster.io/tutorials/mean-stack/opening-rest-routes。本教程的目的是设计Reddit克隆,而我遇到一个与添加用户评论有关的问题。

每当我尝试在新帖子中添加评论时,都会收到错误消息,似乎提示正在执行递归函数调用。这仅发生在帖子的 first 评论上。重新加载服务器后,注释将显示为已保存,并且对帖子所做的任何其他注释都会顺利通过。

错误消息:

events.js:180
      throw er; // Unhandled 'error' event
      ^

RangeError: Maximum call stack size exceeded
    at String.split (<anonymous>)
    at get (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\helpers\get.js:9:22)
    at isBsonType (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\utils.js:158:10)
    at clone (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\utils.js:219:7)
    at cloneObject (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\utils.js:321:17)
    at clone (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\utils.js:205:16)
    at cloneObject (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\utils.js:321:17)
    at clone (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\utils.js:205:16)
    at cloneObject (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\utils.js:321:17)
    at clone (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\utils.js:205:16)
    at cloneObject (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\utils.js:321:17)
    at clone (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\utils.js:205:16)
    at cloneObject (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\utils.js:321:17)
    at clone (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\utils.js:205:16)
    at cloneObject (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\utils.js:321:17)
    at clone (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\utils.js:205:16)
Emitted 'error' event at:
    at C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\model.js:4570:13
    at C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\utils.js:264:16
    at model.<anonymous> (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\mongoose\lib\model.js:476:7)
    at C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\kareem\index.js:315:21
    at next (C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\kareem\index.js:209:27)
    at C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\kareem\index.js:182:9
    at C:\Users\drewg\OneDrive\Desktop\flappernews\flapper-news\node_modules\kareem\index.js:499:38
    at processTicksAndRejections (internal/process/task_queues.js:75:11)

我的帖子模型:

var mongoose = require('mongoose');

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

PostSchema.methods.upvote = function(cb) {
  this.upvotes += 1;
  this.save(cb);
};

mongoose.model('Post', PostSchema);

我的评论模型:

var mongoose = require('mongoose');

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

CommentSchema.methods.upvote = function(cb) {
  this.upvotes += 1;
  this.save(cb);
};

mongoose.model('Comment', CommentSchema);

发生错误的POST路由器:

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

module.exports = router;

我认为这与req.post.comments.push(comment);req.post.save(function(err, post)行有关,因为当我将它们注释掉时,不会发生错误(而且注释也不会发送到服务器)。

1 个答案:

答案 0 :(得分:0)

comment.post = req.post;我认为req.params.post req.post.comments.push(comment);我认为只是post.comments.push(comment);,这里也是req.post.save(function(err, post) {post.

在这个例子中,命名是不好的,因为我认为您在使用猫鼬文档mongoose.model('Post', PostSchema)模型时会使用post(更好的是PostModel)。作为路径中的参数/posts/:post/comments',我认为:postId。并且请求方法是发布router.post