Как я могу l oop через этот массив внутри этого экземпляра моей модели mon goose? - PullRequest
1 голос
/ 27 февраля 2020
const postSchema = new mongoose.Schema({
    post:[
        {postId: String},
        {commentComponent: [
            {comment: [String]},
      ]}
]

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

Это определение схемы для моделирования 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()

есть ли способ итерации внутри этого экземпляра, потому что здесь для l oop не работает

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Вам необходимо передать объект конструктору Posts со свойством post (которое, вероятно, должно называться posts, но с сохранением исходного имени ниже), а для этого свойства вам нужно указать массив.

Этот массив можно построить с помощью Array.prototype.map и 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();

Но если вы предпочитаете, Вы также можете использовать традиционный for-l oop (более похожий на то, что вы пытались сделать):

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();
0 голосов
/ 27 февраля 2020

На основании вашего примера кода я не уверен, что вы пытаетесь сделать. Когда вы используете модель и пытаетесь ее создать, вы можете воспринимать ее как новую особенную запись. Если вы пытаетесь вставить много ссылок в одну запись, я бы предложил разделить их запятыми, а затем вставить их в MongoDB.

Но вы не можете выполнять итерации внутри своего класса Posts.

Если я если бы вы, я бы настроил свой файл примерно так:

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);

Затем создайте файл контроллера js 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'
      });
    }
  }
}


, затем в файле роутера вы можете использовать свой контроллер: маршруты / пост. js

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

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

module.exports = router;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...