node.js - 在ejs中显示帖子的用户名

标签 node.js mongoose ejs

我正在使用 ejs View 引擎制作我的第一个 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
    }
});

这是我的 Controller /显示帖子的路线:

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

现在

如果我的 View 文件(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 }

编辑

更新了 Controller 以填充用户。现在可以了。

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

最佳答案

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

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

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

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

关于node.js - 在ejs中显示帖子的用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42321966/

相关文章:

javascript - 收到错误,指出声明的变量未定义

javascript - Node.js 模块导出返回并使用对象

node.js - 使用 AWS 的动态网站

node.js - Mongoose 查找与查找位置

node.js - Mongoose 删除附加到 User 的数组中的特定注释

javascript - webpack更改路径脚本

node.js - MongoDB 返回 null,但查询单独工作

javascript - session 不是持久的 [PASSPORT]

javascript - mongoose 和 express.js 中的冲突日期

javascript - JavaScript 代码中的 EJS 标签