在ejs中显示post的用户名

我正在使用ejs视图引擎创build我的第一个Node.js应用程序。 我有两种模式:发布和用户。 我试过将这两个模型链接在一起,但似乎无法弄清楚如何显示什么用户发布什么post!

这是用户模型:

// 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:

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

这是我的控制器/显示post的路线:

 // 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(我的用户名)。

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

 { __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}); }) }); 

当你在你的post模式中引用你的用户时,你需要告诉Mongoose来填充用户。 如果不这样做,只会在查询结果中获得对用户的ObjectId引用。

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

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

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