【问题标题】:Mongoose nested populate TypeErrorMongoose 嵌套填充 TypeError
【发布时间】:2021-08-24 10:41:31
【问题描述】:

所以我正在尝试将 cmets 添加到我为猫鼬使用嵌套填充的帖子中。但是一旦我使用嵌套填充,它就会给我“帖子不可迭代”的错误,早些时候当我只预先填充用户数据时它工作正常。我正在分享我的代码,希望它能更清楚地解释我的担忧。

错误

TypeError: /home/vivek/Vivek/CN WEBD/codel/views/home.ejs:16
    14|     <div id="posts-list-container">
    15|         <ul>
 >> 16|             <% for (post of posts){ %>
    17|                 
    18|                 
    19|             <li>

posts is not iterable
    at eval (eval at compile (/home/vivek/Vivek/CN WEBD/codel/node_modules/ejs/lib/ejs.js:662:12), <anonymous>:21:21)
    at home (/home/vivek/Vivek/CN WEBD/codel/node_modules/ejs/lib/ejs.js:692:17)
    at tryHandleCache (/home/vivek/Vivek/CN WEBD/codel/node_modules/ejs/lib/ejs.js:272:36)
    at View.exports.renderFile [as engine] (/home/vivek/Vivek/CN WEBD/codel/node_modules/ejs/lib/ejs.js:489:10)
    at View.render (/home/vivek/Vivek/CN WEBD/codel/node_modules/express/lib/view.js:135:8)
    at tryRender (/home/vivek/Vivek/CN WEBD/codel/node_modules/express/lib/application.js:640:10)
    at Function.render (/home/vivek/Vivek/CN WEBD/codel/node_modules/express/lib/application.js:592:3)
    at ServerResponse.render (/home/vivek/Vivek/CN WEBD/codel/node_modules/express/lib/response.js:1012:7)
    at ServerResponse.res.render (/home/vivek/Vivek/CN WEBD/codel/node_modules/express-ejs-layouts/lib/express-layouts.js:77:18)
    at /home/vivek/Vivek/CN WEBD/codel/controllers/home_controllers.js:24:24
    at immediate (/home/vivek/Vivek/CN WEBD/codel/node_modules/mongoose/lib/model.js:5074:18)
    at process._tickCallback (internal/process/next_tick.js:61:11)

Home_controller.js:

const Post = require('../models/post');

module.exports.home = function(req, res){

    Post.find({})
    .populate('user').
    populate({
            path: 'comments',
            populate: {
                path: 'user'
            }
        })
        .exec(function(err, posts){
            return res.render('home', {
            title: "Home",
            posts: posts
        });
    })

};

Home.ejs: 我在哪里获取数据

   <div id="posts-list-container">
        <ul>
            <% for (post of posts ){ %>
                
                
            <li>
                <p><%= post.user.name %>
                <%= post.content %>
                </p>
                <div class="post-comments">
                    <% if (locals.user){ %> 
                        <form action="/comments/create" method="POST">
                            <input type="text" name="content" placeholder="type here to comment">
                            <input type="hidden" name="post" value="<%= post._id%>">
                            <input type="submit" value="Add comment">
                        </form>    
                    <%}%>

                    <div class="post-comment-list">
                        <ul id="post-comments-<%= post._id %>">
                                <% for (comment of posts.comments){ %>
                                    <p>
                                        <%= comment.content %>
                                        <br>
                                        <small>
                                            <%= comment.user.name %>
                                        </small>
                                    </p>
                                <%} %>
                        </ul>
                    </div>


                </div>
            </li>    
            
            <% }%>


        </ul>

    </div>

CommentsSchema 模型

const mongoose = require('mongoose');


const commentScehma = new mongoose.Schema({
    content:{
        type: String,
        required: true
    },
    //comment belogns to user
    user: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    },
    post: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Post'
    }
},{
    timestamps: true
})

const Comment = mongoose.model('Comment', commentScehma)
module.exports = Comment;

后架构模型

const mongoose = require('mongoose');

const postSchema = new mongoose.Schema({
    content: {
        type: String,
        required: true
    },
    user: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    },
    // inclue the array of id's of all comments in this post schema itself
    comments: [
        {
           type: mongoose.Schema.Types.ObjectId,
           ref: 'comment'  
        }
    ]


},{
    timestamps: true
});


const Post = mongoose.model('Post', postSchema);
module.exports = Post;   

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    我不相信您提供了 server.js(或您的应用程序中的任何起点),因此,我不确定我的示例是否会提供任何指导,但我能够让控制器提供数据到视图。这是我的控制器...

    ./controllers/home.js

    const express = require('express');
    const router = express.Router();
    const posts = require('../models/post');
    
    
    router.get('/', (req, res, err) => {
        posts.find().populate("comments").exec().then(results => {
            console.log(results);
            return res.render('pages/home', { posts: results });
        });
    });
    
    
    module.exports = router;
    

    ...这是我的观点...

    ./views/pages/home.ejs

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <%- include('../partials/head'); %>
    </head>
    <body class="container">
    
    <header>
      <%- include('../partials/header'); %>
    </header>
    
    <main>
      <div class="jumbotron">
        <h1>testing</h1>
    
         <% for (post of posts){ %>
              <li><%= post._id %></li>
              <ul>
                  <% for (comments of post.comments) { %>
                      <li><%= comments.content %></li>
                  
                  <% } %>
              </ul>
         <% }%>
    
         </ul>
      </div>
    </main>
    
    <footer>
      <%- include('../partials/footer'); %>
    </footer>
    
    </body>
    </html>
    

    ...这里是渲染的页面...

    这是我在两个集合中的文档...

    • 帖子
    • 评论

    帖子

    Enterprise replSet [primary] nodetest> db.Posts.find()
    [
      {
        _id: ObjectId("61241efd7a37aa7000116773"),
        comments: [
          ObjectId("61241efd7a37aa7000116770"),
          ObjectId("61241efd7a37aa7000116771"),
          ObjectId("61241efd7a37aa7000116772")
        ],
        content: 'my post content',
        createdAt: ISODate("2021-08-23T22:19:41.193Z"),
        updatedAt: ISODate("2021-08-23T22:19:41.193Z"),
        __v: 0
      },
      {
        _id: ObjectId("61241f892b030d704c728176"),
        comments: [
          ObjectId("61241f892b030d704c728173"),
          ObjectId("61241f892b030d704c728174"),
          ObjectId("61241f892b030d704c728175")
        ],
        content: 'my post content',
        createdAt: ISODate("2021-08-23T22:22:01.949Z"),
        updatedAt: ISODate("2021-08-23T22:22:01.949Z"),
        __v: 0
      }
    ]
    

    评论

    Enterprise replSet [primary] nodetest> db.Comments.find()
    [
      {
        _id: ObjectId("61241efd7a37aa7000116770"),
        content: 'Some loopy content 0',
        createdAt: ISODate("2021-08-23T22:19:41.193Z"),
        updatedAt: ISODate("2021-08-23T22:19:41.193Z"),
        __v: 0
      },
      {
        _id: ObjectId("61241efd7a37aa7000116771"),
        content: 'Some loopy content 1',
        createdAt: ISODate("2021-08-23T22:19:41.193Z"),
        updatedAt: ISODate("2021-08-23T22:19:41.193Z"),
        __v: 0
      },
      {
        _id: ObjectId("61241efd7a37aa7000116772"),
        content: 'Some loopy content 2',
        createdAt: ISODate("2021-08-23T22:19:41.193Z"),
        updatedAt: ISODate("2021-08-23T22:19:41.193Z"),
        __v: 0
      },
      {
        _id: ObjectId("61241f892b030d704c728173"),
        content: 'Some loopy content 0',
        createdAt: ISODate("2021-08-23T22:22:01.948Z"),
        updatedAt: ISODate("2021-08-23T22:22:01.948Z"),
        __v: 0
      },
      {
        _id: ObjectId("61241f892b030d704c728174"),
        content: 'Some loopy content 1',
        createdAt: ISODate("2021-08-23T22:22:01.949Z"),
        updatedAt: ISODate("2021-08-23T22:22:01.949Z"),
        __v: 0
      },
      {
        _id: ObjectId("61241f892b030d704c728175"),
        content: 'Some loopy content 2',
        createdAt: ISODate("2021-08-23T22:22:01.949Z"),
        updatedAt: ISODate("2021-08-23T22:22:01.949Z"),
        __v: 0
      }
    ]
    

    一般评论:

    您似乎正在尝试在集合之间进行双向引用。也就是说,你有亲子关系。这是一对一的安排。一个帖子可以有多个 cmets。如果不是这种情况,请纠正我。发布文档具有所有相关子 cmets 的 ObjectID 数组。 Comment 文档也有父 Post ObjectID。所以关系被定义了两次,一次从父视角,另一次从子视角。

    您没有提供任何示例数据,因此我无法确定数据详细信息是否未对齐。

    查看控制器时,看起来不像是在渲染视图。请看一下我的控制器示例。这就是数据在控制器和视图之间传递的方式。如果数据还没有传递,它将不可用,因此会出现您遇到的错误。

    对于试图帮助您的人,如果您提供问题的简化版本,并包括所有文件名、路径等以及示例数据,事情会变得容易得多。

    我希望我的例子能提供一些帮助。同样,您更清楚地说明将有助于提供更有针对性的帮助。

    【讨论】:

    • 我提供了 index.js(我的应用程序的起点)。
    【解决方案2】:

    问题出在后架构模型上,我将引用作为“comment”而不是“Comment”。

    【讨论】:

      猜你喜欢
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      • 2019-12-06
      • 2014-10-27
      • 2018-06-07
      • 1970-01-01
      相关资源
      最近更新 更多