我正在尝试通过遵循这里的指南来学习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)
行有关,因为当我将它们注释掉时,不会发生错误(而且注释也不会发送到服务器)。
答案 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