Как создать самореференсную схему MongoDB и опубликовать маршруты, используя nodejs? - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь создать подобную родительско-дочернему систему, в которой дочерняя система имеет ту же схему, что и родительская. Ниже моя родительская схема, здесь дочерние элементы снова ссылаются на parentSchema,

var mongoose    = require("mongoose");  
var parentSchema    =   new mongoose.Schema({
name: String,
children:[
    {
        ref: this
    }
  ],
});

module.exports  =   mongoose.model("Parent", parentSchema);

Маршруты выглядят так

app.get("/", function(req, res){
Parent.find({}).populate("children").exec(function(err, allParents){
    if(err){
        console.log(err);
    }else{
        res.render("index",{parents: allParents});
    }
});
});

app.post("/", function(req,res){
    var name    =   req.body.name;
    var desc    =   req.body.desc;
    var newParent = {name: name, description: desc}

Parent.create(newParent, function(err, newlyCreate){
    if(err){
        console.log(err);
    }else{
        res.redirect("/");
    }
    });
});

app.post("/:id", function(req, res){
 Parent.findById(req.params.id, function(err, parent){
    if(err){
        console.log(err);
        res.redirect("/");
    }else{
        parent.children.push(req.body.child);
        parent.save();
        console.log(parent.children);
        res.redirect("/");
    }
 });
});

Проблема заключается в том, что когда я отправляю данные из формы для отправки по маршруту, она печатает их, но после помещения их в parent.children и последующей печати parent.children показывает нулевое значение. В чем проблема??? E JS Страница выглядит следующим образом: -

<form action="/" method="POST">
  <div class="form-group">
    <input type="text" name="name" placeholder="Name">
  </div>
  <div class="form-group">
    <input type="text" name="desc" placeholder="Description">
  </div>
  <div class="form-group">
    <button class=btn-primary btn-block">Submit</button>
    <a href="/">Go Back</a>
  </div>
</form>
<div class="row">
<% parents.forEach(function(module){%>
        <ul class="list-group">
            <li class="list-group-item" style="margin-bottom: 5%;">
                <h2><%= module.name%></h2>
      <%= module.description %>
      <% console.log(module.children) %>
      <%module.children.forEach(function(node){%>
        <% console.log(node) %>
      <%});%>
                <div class="container">
                    <div class="row">
                        <div>
            <form action="/<%= module._id %>" method="POST">
              <div class="form-group">
                <input type="text" name="name" placeholder="Name">
              </div>
              <div class="form-group">
                <input type="text" name="desc" placeholder="Description">
              </div>
                                <button>Submit</button>
                            </form>
          </div>
        </div>
      </div>
    </li>
  </ul>
</div>
<% }); %>
</div>

Может кто-нибудь сказать, в чем проблема в приведенном выше коде, или кто-нибудь может предложить какой-либо другой способ сделать этот тип родительско-дочерней структуры ????

1 Ответ

1 голос
/ 02 мая 2020

Кажется, что parent.save() является асинхронным. Возможно, вы можете попробовать это вместо этого.

parent.save().then(()=>{
  console.log(parent.children); 
  res.redirect("/");
});

или вы можете использовать asyn c -aait после помещения async перед определением функции,

await parent.save();
console.log(parent.children);
res.redirect("/");

Пожалуйста, напишите в комментарии, если проблема все еще сохраняется.

...