使用EJS显示对象属性时出现问题

时间:2020-07-03 19:02:16

标签: javascript node.js express object ejs

我正在尝试在ejs模板的应用程序的评论中插入作者的用户名。

以下标记:

<%= review.author %>

按预期工作,输出:

{ _id: 5eff6793e7f26811e848ceb1, username: 'mike', __v: 0 }

但是添加username属性,即此标记:

<%= review.author.username %>

这是来自适当控制器的代码:

async postShow(req, res, next){

  let post = await Post.findById(req.params.id).populate({
    path: 'reviews',
    options: { sort: { '_id': -1 } },
    populate: {
      path: 'author',
      model: 'User'
    }
  });
  res.render('posts/show', { post });
},

输出nada。我是新手,但我不知道为什么我在这个看似简单的问题上陷入困境。我哪里出问题了?

谢谢!

2 个答案:

答案 0 :(得分:2)

使用lean()返回对象而不是猫鼬文档

let post = await Post.findById(req.params.id).lean().populate({
    path: 'reviews',
    options: { sort: { '_id': -1 } },
    populate: {
      path: 'author',
      model: 'User'
    }
  });
  res.render('posts/show', { post });
},

答案 1 :(得分:0)

<%= review.author.username %>

以上操作无效,因为作者的内容(一个Schema.Types.ObjectId,引用到User模型)包含在多余的 array 中的一个对象中:

const ReviewSchema = new Schema({
  body: String,
  rating: Number,
  author: [{
      type: Schema.Types.ObjectId,
      ref: 'User'
    }]
});

删除阵列可解决此问题。我不确定为什么最初包含它。已更正:

const ReviewSchema = new Schema({
  body: String,
  rating: Number,
  author: {
      type: Schema.Types.ObjectId,
      ref: 'User'
    }
});