Я хочу добавить несколько комментариев к моей статье (пн goose) - PullRequest
2 голосов
/ 23 января 2020

Я создаю веб-сайт и хочу получить некоторые данные.

Я хочу создать две статьи с двумя комментариями в каждой:

var mongoose = require("mongoose"),
    Article = require("./models/articles.js"),
    Comment = require("./models/comments.js");

var articleData = [
    {
        title: "Fast Cars",
        author: "Steve Novak",
        company: "AthLead",
        body: "SOME TEXT"
    },
    {
        title: "New Design",
        author: "Kevin Garnett",
        company: "Revoos",
        body: "COOL ARTICLE"
    }
];

var commentData = [
    {
        body: "I really love the new design",
        author: "Mark Cuban"
    },
    {
        body: "This is hitting my funny bone",
        author: "Lisa Jones"
    }
];

Я удаляю все предыдущие комментарии и статьи .

Затем для каждой статьи я сначала создаю статью, а затем нажимаю два комментария.

У меня возникает проблема при сохранении вновь сформированной статьи в базу данных:

Помещение article.save () в 1. вызывает параллельную ошибку save ()

В то время как размещение в 2. вызывает сохранение комментария.


function seedDB() {
    Comment.deleteMany({}, function (err) {
        if (err) {
            console.log(err);
        }
        Article.deleteMany({}, function (err) {
            if (err) {
                console.log(err);
            }

                articleData.forEach(function (article) {
                    Article.create(article, function (err, article) {
                        if (err) {
                            console.log(err);
                        } else {
                            commentData.forEach(function(comment) {
                                Comment.create(comment, function (err, comment) {
                                    if (err)
                                        console.log(err);
                                    else {
                                        article.comments.push(comment);
                                        //     PROBLEM
                                        // 1. article.save();
                                    }

                                })
                            })
                            // PROBLEM
                            //2. article.save();
                        }
                    });
                });

            });


        });
    });

    console.log("Database Reset");
}



module.exports = seedDB;

Ответы [ 3 ]

1 голос
/ 23 января 2020

В настоящее время вы находитесь в аду обратного вызова и используете async/await willl go, что делает ваш код читабельным и, таким образом, облегчает отладку.

Рассмотрим следующий рабочий процесс, который использует async/await

async function seedDB() {
    try {
        // clean up all comments
        await Comment.deleteMany({}).exec()

        // clean up all articles
        await Article.deleteMany({}).exec()

        // create articles
        await Article.create(articleData)

        // create comments 
        const comments = await Comment.create(commentData)

        // update articles with the new comments
        const updatedArticles = await Article.updateMany(
            {}, 
            { '$set': { comments } }
        ).exec()

        console.log(updatedArticles)

    } catch (err) {
        console.error(err)
    }
}
1 голос
/ 23 января 2020

Вы можете передать массив документов в Model.create, просто сначала создайте comments, затем используйте Array.map, чтобы создать новый массив из articletData с comments присваивается каждой статье

с использованием async/await:

async function seedDB() {

  ...

  const comments = await Comment.create(commentData);
  const articles = await Article.create(articleData.map(article => { article.comments = comments; return article }));
  ...

с использованием Promise.then():

function seedDB() {

  ...

  Comment.create(commentData).then(comments => 
    Article.create(articleData.map(article => { article.comments = comments; return article })).then(articles => {
    
    });
  });
  
  ...
0 голосов
/ 23 января 2020

При первом Article.create... при успешном создании функция возвращает объект article или ошибку на другой стороне.

Вам необходимо запустить forEach l oop во вновь созданной статье, чтобы каждая статья содержала комментарии.

вам нужно работать с существующими вновь созданными данными статьи.

Пример

articleData.forEach(function (article) {
  Article.create(article, function (err, article) {
    if (err) {
     console.log(err);
    } else {
      article.update(
       { "_id": ObjectId(article.id) },
       { $push: { comments: commentData } }
      );
      // OR try something like 
      // article.comments = commentData
      // OR
      // article.comments.insert(commentData)
      article.save();
    }
  });
});
...