Node JS mongoose 创建博文评论系统

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res