Search code examples
node.jsmongodbmongoosepugmongoose-schema

Mongoose schema for article


I'm building a news website, and I this mongoose schema:

let mongoose = require('mongoose');

let articleSchema = mongoose.Schema({
  image1:{
    type: String,
    required: true
  },
  title:{
    type: String,
    required: true
  },
  author:{
    type: String,
    required: true
  },
  date:{
    type: String,
    required: true
  },
  updated:{
    type: String,
    default: 'not updated'
  },
  title_nd:{
    type: String,
    required: false
  },
  body:{
    type: String,
    required: true
  },
  comments: [commentsSchema],
  likes:{ type:Number, default:0 }
});

let Article = module.exports = mongoose.model('Article', articleSchema);

And I want to add a form so users can add their comments. The question is how do I create a new schema for comments and link it to article schema, and then if the user adds a comment the comment added to the database and then shows on the article comment section?


Solution

  • so I found a solution for this:

    // :id is all articles with all ids
    router.post('/:id', function (req, res) {
      let comment = {};
      comment.body = req.body.body;
      comment.user = req.user;
      comment.date = new Date(Date.now()).toDateString();
    
      // Express validator
      req.checkBody('body').len(5, 100);
    
      let errors = [];
      errors = req.validationErrors();
    
      if(errors) {
        Article.findById(req.params.id, function (err, article) {
          if(err)throw err;
          req.flash('danger', 'Body minimum length is 5 and maximum 100!');
          res.redirect('/articles/'+article.id);
        });
      } else {
        Article.findById(req.params.id, function (err, article) {
          if(err)throw err;
         article.comments.push({'body':comment.body,'user':comment.user,'date':comment.date});
          article.save(function (err) {
            if (err) {
              throw err;
            }else {
              req.flash('success', 'Comment added!');
              res.redirect('/articles/'+article.id);
            }
          });
        });
      }
    });
    

    EDIT: code above in more readable form:

    router.post('/:id', async (req, res) => {
      let article = await Article.findById(req.params.id);
    
      if (!article) res.status("403");
    
      let articleUrl = "/articles/${article.id}";
    
      let comment = {
        body: req.body.body,
        user: req.user,
        date: new Date(Date.now()).toDateString();
      };
    
      if (commment.body.lengh >= 100 || comment.body.length <= 5) {
        req.flash('danger', 'Body minimum length is 5 and maximum 100!');
        return res.redirect(articleUrl);
      }
    
      articles.comments.push(comment);
    
      await article.save();
    
      req.flash('success', 'Comment added!');
      res.redirect(articleUrl);
    
    });