gpt4 book ai didi

node.js - Node JS mongoose 创建博客文章评论系统

转载 作者:行者123 更新时间:2023-12-03 21:43:41 25 4
gpt4 key购买 nike

我正在尝试用 Mongoose 和 express 建立一个带有评论系统的简单博客。这里没有创建和发布博客的问题,每个帖子都可以正确显示。但是,有一些与评论和每个博客相关的问题。评论和博客帖子之间的关系是通过在帖子架构中应用 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,
trim: true,
required: true
},
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,
trim: true,
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', (req, res) => {
Post.findById(req.params.id)
.populate('comments')
.exec(function(err, results) {
if(err) {console.log(err)}
res.render('post_details', {title: 'Post details', post:
results, comments: results.comments})
})
})

router.get('/new', (req, res) => {
res.render('create-post', {title: 'Create a post'})
})

router.post('/new', (req, 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('/', (req, 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,
trim: true,
required: true
},
text: {
type: String,
trim: true,
required: true
},
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('/')
})

})
以上是我修复错误的方法,希望它可以帮助某人。
感谢您阅读

关于node.js - Node JS mongoose 创建博客文章评论系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65931572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com