在 ejs 中显示帖子的用户名

Posted

技术标签:

【中文标题】在 ejs 中显示帖子的用户名【英文标题】:Show posts' usernames in ejs 【发布时间】:2017-07-08 09:33:54 【问题描述】:

我正在使用 ejs 视图引擎制作我的第一个 Node.js 应用程序。我有两个模型:帖子和用户。我尝试将这两个模型链接在一起,但似乎无法弄清楚如何显示哪些用户发布了哪些帖子!

这是用户模型:

// User Schema
var UserSchema = mongoose.Schema(
    username: 
        type: String,
        index:true
    ,
    password: 
        type: String
    ,
    email: 
        type: String
    ,
    name: 
        type: String
    ,
    facebook : 
            id           : String,
            token        : String
        ,
    posts : [ type: mongoose.Schema.Types.ObjectId, ref: 'Post' ]
);

这是帖子:

// Post Schema
var PostSchema = mongoose.Schema(
    user: type: mongoose.Schema.ObjectId, ref: 'User',
    name: 
        type: String,
        index:true
    ,
    text: 
        type: String
    
);

这是我显示帖子的控制器/路由:

// Post page
router.get('/post', function(req, res)
    req.db.collection('posts').find().toArray((err, result) => 
        if (err) return console.log(err)
        res.render('posts/post', posts: result, req: req);
    )  
);

现在

如果我的视图文件中有这个(ejs):

<%posts.forEach(function(element)%>
        <li>
            <%=element.name%> <br>
            <%=element.text%> <br>
            <%=element.user.username %>
        </li>
        <br>
 <%);%>

我得到“用户名”的输出为“未定义”

如果我把这个改为:

<%posts.forEach(function(element)%>
        <li>
            <%=element.name%> <br>
            <%=element.text%> <br>
            <%=element.user %>
        </li>
        <br>
 <%);%>

我得到的用户名是:d6cf225e(我的用户 ID)。

为什么我不能通过添加“.username”来检索我的用户名?当我添加新帖子时,似乎所有信息都在那里。在我的控制台中,我可以看到正在插入以下消息:

 __v: 0,
 name: 'lol',
 text: 'test',
 user: 
   _id: d6cf225e,
    username: 'Test',
    email: 'test@test.se',
    name: 'Test',
    __v: 0,
    posts: [],
    facebook: 
       token: 'TOKENNUMBER'
       id: '23123123'  ,
    _id: 2d8afa19fbf6 

编辑

更新了控制器以填充用户。现在可以了。

// Post page
router.get('/post', function(req, res)
    Post.find().populate('user').exec(function(err, result) 
        if (err) return console.log(err)
        res.render('posts/post', posts: result);
     )
);

【问题讨论】:

【参考方案1】:

当您在帖子架构中引用您的用户时,您需要告诉 Mongoose 给populate 用户。如果不这样做,您将在查询结果中仅获得对用户的 ObjectId 引用。

req.db.collection('posts')
  .find()
  .populate('user')
  .toArray((err, result) => 
    // logic here
)  

我不认为 ejs 与此有关,因为它只是渲染引擎。

在您的插入中,您可能会发送所有用户信息,但我不太确定,因为您没有向我们展示插入查询的完整代码。

【讨论】:

你是对的。我更新了我的答案以确保您可以看到更改

以上是关于在 ejs 中显示帖子的用户名的主要内容,如果未能解决你的问题,请参考以下文章

如何从给定 ID 获取用户信息并使用 Node.js 和 EJS 显示它[关闭]

在 .ejs 文件中获取当前页面?

无法读取未定义的属性“名称” - mongoose、express、nodeJS、ejs

无法在占位符内使用 EJS 显示数据

在 ejs 模板文件中使用 mongoose 获取数据

在 iOS 上显示用户帖子