循环遍历包含子数组的嵌入式文档并将其显示在EJS文档

时间:2015-09-14 01:04:56

标签: node.js mongodb express mongoose ejs

我的目标是尝试循环嵌入的文档以显示相同ID帖子的评论。

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

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

以下是我收到将评论添加到具有当前ID的帖子的方式:

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('/');
        }
    });
});

这就是我向主页显示所有帖子和评论的方式:

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>
    <% } %>

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

但是,我可以使用以下内容访问属于帖子的名称和评论:

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

我对如何在帖子中添加嵌套循环以便仅显示属于该特定帖子的评论和名称感到困惑。我目前有假文本,其中的评论也可以作为例子。

*更新*

这是我到目前为止所做的:

    <% 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>
        <% } %>
        <% } %>

这是在正确的帖子上打印出评论,这是我想要的,但是现在它打印了很多未定义的地方。例如,这就是页面上的内容:

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

发表评论:

姓名:戴安娜

评论:嘿,它怎么样了??

姓名:罗比

评论:闭嘴!

姓名:Frankie

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

名称:未定义

评论:未定义

名称:未定义

评论:未定义

名称:未定义

评论:未定义

名称:未定义

评论:未定义

名称:未定义

评论:未定义

名称:未定义

评论:未定义

名称:未定义

评论:未定义

名称:未定义

1 个答案:

答案 0 :(得分:2)

<% 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>
<% } %>

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