循环遍历具有子数组的嵌入式文档并将它们显示在 EJS 文档上

Looping through an embedded document that has sub arrays and display them on EJS document

我的目标是尝试遍历嵌入式文档以显示相同 ID posts 的评论。

这是我在 node.js 服务器中的模式结构:

var postSchema = new mongoose.Schema({
    name: String,
    post: String,
    comment: [
        {
        commentname: String,
        comment: String
        }
    ]
});

以下是我如何接收将评论添加到具有当前 ID 的 post:

app.post('/comment/:id', function(req, res) {
    console.log(req.body);
    var comments = {
        commentname: req.body.name,
        comment: req.body.comment
    }
    Posts.update({_id: req.params.id}, {$push: {comment: comments}}, {safe: true, upsert: true}, function(err, comments){

        if (err) {
            console.log("Issue with adding a comment");
            res.redirect('/');
        } else {
            console.log("Success Adding Comments");
            res.redirect('/');
        }
    });
});

这就是我在主页上显示所有 post 和评论的方式:

app.get('/', function(req, res) {
    Posts.find({}, function(err, posts) {
        if (err) {
            console.log('Issue receiving posts');
        } else {
            console.log('Receiving Posts Success');
            res.render("index", {posts: posts});
        }
    });
});

这是我的 EJS 文件的样子:

    <% for (index in posts) { %>
    <div class="posts">
        <h3>Name: <%= posts[index].name %></h3>
        <h3>Message: <%= posts[index].post %></h3>
        <div class="comment">
            <h3 class="text-underline"><i>Post a Comment: </i></h3>
            <div class="comments">
                <p>Name: Jimmy</p>
                <p>Comment: I agree, the codingdojo is pretty swell</p>
            </div>
            <div class="comments">
                <p>Name: Bob</p>
                <p>Comment: Why aren't you guys working?</p>
            </div>
            <form action="/comment/<%= posts[index]._id %>" method="post">
                <label for="name" style="display: block">Name: </label>
                <input type="text" name="name" id="name">
                <br />
                <label for="comment">Message: </label>
                <textarea name="comment" id="comment" class="form-control"></textarea>
                <button class="btn btn-info pull-right">Post Comment</button>
            </form>
        </div>
    </div>
    <% } %>

我无法弄清楚如何在 post 中添加嵌套循环并显示属于 post 的特定评论。

但是我可以通过以下方式访问属于 post 的名称和评论:

<%= console.log(posts[0].comment[0].commentname) %>
<%= console.log(posts[0].comment[0].comment) %>

我对如何在 post 中添加嵌套循环以仅显示属于特定 post 的评论和名称感到非常困惑。我目前有一个虚拟文本,用于说明评论应该去哪里,也作为一个例子。

* 更新 *

这是我目前的情况:

    <% for (index in posts) { %>
    <div class="posts">
        <h3>Name: <%= posts[index].name %></h3>
        <h3>Message: <%= posts[index].post %></h3>
        <div class="comment">
            <h3 class="text-underline"><i>Post a Comment: </i></h3>
        <% if (posts[index].comment != 'undefined') { %>
        <%      for (commentindex in posts[index].comment) { %>
            <div class="comments">
                <p>Name: <%= posts[index].comment[commentindex].commentname %></p>
                <p>Comment: <%= posts[index].comment[commentindex].comment %></p>
            </div>
        <% } %>
        <% } %>

这是在正确的 post 处打印出注释,这正是我想要的,但是现在它会无缘无故地打印出很多未定义的内容。例如,这是页面上的内容:

姓名:维多利亚 消息:午餐什么时候到?

Post一条评论:

姓名:戴安娜

评论:嗨,最近怎么样!?

姓名:罗比

评论:闭嘴!

姓名:弗兰基

评论:嘿,我需要和你谈谈!

姓名:未定义

评论:未定义

姓名:未定义

评论:未定义

姓名:未定义

评论:未定义

姓名:未定义

评论:未定义

姓名:未定义

评论:未定义

姓名:未定义

评论:未定义

姓名:未定义

评论:未定义

姓名:未定义

<% for (index in posts) { %>
<div class="posts">
    <h3>Name: <%= posts[index].name %></h3>
    <h3>Message: <%= posts[index].post %></h3>
    <div class="comment">
        <h3 class="text-underline"><i>Post a Comment: </i></h3>
<% for (commentindex in posts[index].comment) { %>
        <div class="comments">
            <p>Name: <%= posts[index].comment[commentindex].commentname %></p>
            <p>Comment: <%= posts[index].comment[commentindex].comment %></p>
        </div>
<% } %>
        <form action="/comment/<%= posts[index]._id %>" method="post">
            <label for="name" style="display: block">Name: </label>
            <input type="text" name="name" id="name">
            <br />
            <label for="comment">Message: </label>
            <textarea name="comment" id="comment" class="form-control"></textarea>
            <button class="btn btn-info pull-right">Post Comment</button>
        </form>
    </div>
</div>
<% } %>

在这里您可以访问属于 post 的名称和评论,因为循环在 posts 循环内。