在Jade中访问mongoose非架构值

时间:2013-05-20 19:38:07

标签: node.js mongodb express mongoose pug

我在Jade中遇到了一个非常奇怪的问题,我无法访问Schema中未定义的值。

我在我的架构上使用strict:false并将值保存到它。我的数据如下:

{
 "title" : "This is a title in the schema",
 "notInSchema" : "This will never show up"
}

这有效:

h1= post.title 

这不起作用:

h1= post.notInSchema

如果我将所有数据转储到模板中,我可以看到两个数据:

pre= JSON.stringify(options,null,'\t')      //{"title" : "This is a title in the schema", "notInSchema" : "This will never show up"}

如果我将notInSchema添加到我的架构中,它会显示出来。如何在不添加的情况下执行此操作?

2 个答案:

答案 0 :(得分:1)

不是将原始Mongoose文档传递给Jade,而是传递其序列化版本:

res.render('yourtemplate', {
  post : post.toJSON() // .toJSON() is also called by JSON.stringify()
});

我相信Mongoose只为文档中的字段创建访问器。任何其他字段,即使它们存储在数据库中,也不会得到,因此无法直接访问。

documentation似乎暗示了类似的内容:

  

注意:在您的实例中不存在的实例上设置的任何键/值   无论架构选项如何,都始终忽略架构。

编辑,因为您正在处理结果集,因此需要在其中的每个文档上调用toJSON。最简单的方法是使用map(希望我能正确使用CF语法):

res.render "admin",
  title   : "Admin Dashboard"
  results : results
  users   : results.users.map (user) ->
    user.toJSON()
  messages: req.flash() || {}

虽然这仍然会使results'未经处理'。或者,您可以将映射保留在async.series中的单独步骤中。例如:

 Company
   .find()
   .exec (err,companies)->
     next(null,companies.map (company) ->
       company.toJSON()
     )

或者在您的模板中使用toJSON来访问您需要访问“unschema”属性的任何对象。

答案 1 :(得分:0)

我用:

model.find({Branch:branch},function (err, docs){
if (err) res.send(err)

 res.render('index', 
    {tree: tree,
      articulos: JSON.parse(JSON.stringify(docs)) 
    })})
   });