Express.js:有什么方法可以将Mongoose查询字段设置为全局可访问模板(hanldlebars)?

Express.js:有什么方法可以将Mongoose查询字段设置为全局可访问模板(hanldlebars)?

问题描述:

例如,在此查询:Express.js:有什么方法可以将Mongoose查询字段设置为全局可访问模板(hanldlebars)?

User.findById(req.user._id) 
     .populate({path: 'roles.account', populate: { path: 'groups', select: 'name'} }) 
     .exec(function(err, user) { 
     if (err) { 
      return callback(err, null); 
     } 
     return callback(null, user); 
     }); 

我可以在我的模板像{{user.roles.account.groups.[0].name}}检索组的名称,如果我把它传递给res.render功能仅针对特定的路线。

我怎样才能得到这个值(而不是整个文件)是全球性的?我试图为用户模型设置一个方法,并将其传递回res.locals,但它没有奏效。它必须是动态的,取决于req.user._id

是否有其他方法使其成为全球?

+0

从代码的样子,我假设你正在使用一个函数并将它传递给'req',对吧?如果是这样,为什么不在处理程序中编写查询,并且可以在回调中使用'res.render('viewName',{user:user})'而不是'return callback(null,user)' –

+0

这就是你当你想渲染特定的视图时,我想要的是这个值可以在应用程序的所有视图中访问,具有类似的功能,例如,如果你在res.locals或app.locals中设置了某些东西 – ASem

+0

我看到,并且你试图把它放在'app.use(req,res,next){}'函数中,并将它设置为'res.locals'?你试图为用户模型设置一个方法是什么意思? –

所以,我看着你提供的链接,并注意到一些事情。

首先在app.use()函数中,您在异步回调之后调用next(),而不是在它内部。所以在异步完成之前调用它。

二是在forEach功能,你写一个err说法,它不会根据Docs

我创建的模式已经和这个代码工作对我罚款,无需另一种方法:

app.use(function (req, res, next) { 
    if (req.user) { 
    User.findById(req.user._id) 
     .populate({ path: 'roles.account', model: 'Account', populate: { path: 
       'groups', select: 'name' } }) 
     .exec(function (err, user) { 
     if (err) { 
      return err 
     } 
     res.locals.groups = user.roles.account.groups 
     next() 
     }) 
    } else { 
    next() 
    } 
}) 
+0

好的解决方法,谢谢。只有你需要使用user.roles.account.groups [0] .name或者像{{#each groups}}这个{{/ each}}那样输入它,因为它是一个数组 – ASem