如何解决Node JS mongoose 创建博文评论系统
我正在尝试使用带有猫鼬和快递的评论系统构建一个简单的博客。这里没有创建和发布博客的问题,每个帖子都可以正确显示。但是,有一些与评论和每个博客相关的问题。评论和博客帖子之间的关系是通过在帖子架构中应用 mongoose.Schema.Types.ObjectId 来建立的,并且已经创建了评论来存储评论 id 数组。我认为架构结构是正确的,我的路由代码中可能存在一些问题,请帮忙,谢谢。
// Post Schema
const mongoose = require('mongoose');
const postSchema = new mongoose.Schema({
title: {
type: String,trim: true,required: true
},text: {
type: String,date: {
type: Date,default: Date.now
},comments: [{
type: mongoose.Schema.Types.ObjectId,ref: 'Comment'
}]
})
postSchema.virtual('url').get(function(){
return '/post/' + this._id
})
module.exports = mongoose.model('Post',postSchema);
// Comment Schema
const mongoose = require('mongoose');
const commentSchema = new mongoose.Schema({
text: {
type: String,required: true
},date: {
type: Date,default: Date.now
}
})
module.exports = mongoose.model('Comment',commentSchema);
// Router
const express = require('express');
const Post = require('../models/post');
const Comment = require('../models/comment');
const router = new express.Router();
// Get comments
router.get('/post/:id/comment',(req,res) => {
res.render('post-comment',{title: 'Post a comment'})
})
// Create and Post comments,this is where I think I made mistakes
router.post('/post/:id/comment',async (req,res) => {
const comment = new Comment({text: req.body.text});
const post = await Post.findById(req.params.id);
const savedPost = post.comments.push(comment);
savedPost.save(function(err,results){
if(err) {console.log(err)}
res.render('post_details',{title: 'Post details',comments:
results.comments})
} )
})
// Get each post details.
// Trying to display comments,but it is all empty and I realized
// the comments array is empty,I can see the comments create in
// mongodb database why is that?????
router.get('/post/:id',res) => {
Post.findById(req.params.id)
.populate('comments')
.exec(function(err,results) {
if(err) {console.log(err)}
res.render('post_details',post:
results,comments: results.comments})
})
})
router.get('/new',res) => {
res.render('create-post',{title: 'Create a post'})
})
router.post('/new',res) => {
const post = new Post({
title: req.body.title,text: req.body.text
});
post.save(function(err) {
if(err) {console.log(err)}
res.redirect('/')
})
})
router.get('/',res) => {
Post.find()
.exec(function(err,results) {
if(err) {console.log(err)}
res.render('posts',{title: 'All Posts',posts: results})
})
});
module.exports = router;
解决方法
我发布这个问题已经几天了,到目前为止我还没有收到任何答复。但我已经弄清楚为什么我的代码不起作用,这篇文章将尝试回答我几天前问的这个问题,希望它可以帮助那些正在为同样的问题苦苦挣扎的人。
我这里的问题是创建的每条评论无法推送到Post中的评论数组中,所以评论无法显示,因为数组为空。
如果您查看我的 Schema 代码,您可能会意识到我在评论架构上犯了错误,因为我没有定义帖子键值对,因此正确的评论和帖子架构应如下所示。这里的逻辑是每篇博文下面可以有多个评论,所以post Scheme中的评论应该创建为一个数组,但是每条评论只能在一个帖子下面,因此comment schema中的post键值对应该是只在一个对象中
const mongoose = require('mongoose');
const commentSchema = new mongoose.Schema({
text: {
type: String,trim: true,required: true
},date: {
type: Date,default: Date.now
},// each comment can only relates to one blog,so it's not in array
post: {
type: mongoose.Schema.Types.ObjectId,ref: 'Post'
}
})
module.exports = mongoose.model('Comment',commentSchema);
并且帖子架构应该如下
const mongoose = require('mongoose');
const postSchema = new mongoose.Schema({
title: {
type: String,text: {
type: String,date: {
type: Date,default: Date.now
},// a blog post can have multiple comments,so it should be in a array.
// all comments info should be kept in this array of this blog post.
comments: [{
type: mongoose.Schema.Types.ObjectId,ref: 'Comment'
}]
})
postSchema.virtual('url').get(function(){
return '/post/' + this._id
})
module.exports = mongoose.model('Post',postSchema);
我没有做的另一件重要的事情是,每次发表评论时,都应该将这条评论推送到 post.comments 数组中。我没有做这一步,这就是为什么我的数组总是空的,没有评论显示。纠正此问题的代码是转到文件 commentRouter.js(我已经创建了 postRouter.js 和 commentRouter.js),在下面添加代码
router.post('/post/:id/comment',async (req,res) => {
// find out which post you are commenting
const id = req.params.id;
// get the comment text and record post id
const comment = new Comment({
text: req.body.comment,post: id
})
// save comment
await comment.save();
// get this particular post
const postRelated = await Post.findById(id);
// push the comment into the post.comments array
postRelated.comments.push(comment);
// save and redirect...
await postRelated.save(function(err) {
if(err) {console.log(err)}
res.redirect('/')
})
})
以上是我修复我的错误的方法,希望它可以帮助某人。
感谢阅读
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。