Jemail
Jemail

Reputation: 45

How can I loop through this array inside this instance of my mongoose model?

const postSchema = new mongoose.Schema({
    post:[
        {postId: String},
        {commentComponent: [
            {comment: [String]},
      ]}
]

})
const Posts = mongoose.model('Posts', postSchema)

This is the definition of the schema for modeling the mongodb


const postLinks = await getPostLinks();    
const posts =  new Posts({
        for (let i = 0; i < postLinks.length; i++) {     
            const comment =  await getComment(postLinks[i]) // here it takes postLinks as a paramaeter to get an array of comment
            post: [
                {postId: postLinks[i]},
                {commentComponent: [
                    {comment: comment}
                ]}
            ]
        }
    })
const result = await posts.save()

is there a way of iterating inside this instance because the for loop here is not working

Upvotes: 1

Views: 232

Answers (2)

Alberto Trindade Tavares
Alberto Trindade Tavares

Reputation: 10396

You need to pass an object to the Posts constructor with a property called post (which probably should be called posts, but will keep the original name below), and for this property, you need to specify an array.

This array can be built by using Array.prototype.map and Promise.all:

const post = await Promise.all(
    postLinks.map(async (postLink) => {
        const comment = await getComment(postLink);

        return {
            postId: postLink,
            commentComponent: [{ comment }],
        };
    })
);

const posts =  new Posts({ post });
const result = await posts.save();

But if you prefer, you can use the traditional for-loop (more similar to what you were trying to do) as well:

const post = [];
for (let i = 0; i < postLinks.length; i++) {  
    const comment = await getComment(postLinks[i]);

    post.push({
        postId: postLinks[i]},
        commentComponent: [{ comment }]
    });
}

const posts =  new Posts({ post });
const result = await posts.save();

Upvotes: 1

Tanner
Tanner

Reputation: 868

Based on your code example I am not certain what you are attempting to do. When using a Model and trying to create you can think of as a new singular record. If you are trying to insert many links into a single record I would suggest comma separating them then inserting that into your MongoDB.

But you cannot iterate inside your Posts class like that.

If I were you I would set up my file something like this:

file: models/Post.js:

const mongoose = require('mongoose');

const PostSchema = new mongoose.Schema({
  text: {
    type: String,
    trim: true,
    required: [true, 'Please add some text']
  },
  link: {
    type: String,
    required: [true, 'Please add link']
  },
  createdAt: {
    type: Date,
    default: Date.now
  }
});

module.exports = mongoose.model('Post', PostSchema);

Then create a controller js file file: controllers/posts.js:

const Post = require('../models/Post');

// @desc    Add Post
// @route   POST /api/v1/posts
// @access  Public
exports.addPost = async (req, res, next) => {
  try {
    // get post data from the request
    // mongo returns a promise so await on it
    const post = await Post.create(req.body);

    return res.status(201).json({
      success: true,
      data: post
    }); 
  } catch (err) {
    if(err.name === 'ValidationError') {
      const messages = Object.values(err.errors).map(val => val.message);

      return res.status(400).json({
        success: false,
        error: messages
      });
    } else {
      return res.status(500).json({
        success: false,
        error: 'Server Error'
      });
    }
  }
}


then in your router file, you can use your controller: routes/post.js

const express = require('express');
const router = express.Router();
const { addPost } = require('../controllers/posts');

router
  .route('/')
  .post(addPost);

module.exports = router;

Upvotes: 0

Related Questions