Express路由,更多DRY方法将数据传递给路由

时间:2014-11-12 19:41:11

标签: node.js express

我有几个mongodb模型,我正在通过我的路线。我正在采取的方法留下了很多重复的代码。

var AboutData    = mongoose.model( 'AboutData' );
var BlogData     = mongoose.model( 'BlogData' );

app.get('/about', function(req, res, next) {
  BlogData.find(function(err, blogitems){
     if(err) { return next(err); } 
   AboutData.find(function(err, items){
     if(err) { return next(err); }
     res.render('index.ejs',{
       homelist: ['home', 'about', 'services', 'volunteer', 'contact', 'give', 'blog'],
       aboutlist: items,
       bloglist: blogitems,
       bootstrappedUser: req.user,
       page: 'about'
     });
  });
});
});

有没有更好的方法,我可以采取让所有路线都有多个模型?

1 个答案:

答案 0 :(得分:1)

您可以通过在res.locals上设置属性来创建一个设置公共视图变量的中间件。这是一个例子:

app.use(function(req, res, next) {
  res.locals.bootstrappedUser = req.user;
  res.locals.homelist = [
    'home', 'about', 'services', 'volunteer', 'contact', 'give', 'blog'
  ];

  BlogData.find(function(err, blogitems) {
    if (err)
      return next(err);
    res.locals.bloglist = blogitems;
    next();
  });
});

app.get('/about', function(req, res, next) {
  AboutData.find(function(err, items){
    if (err)
      return next(err);

    // here `index.js` will have access to `bootstrappedUser`, `homelist`, and
    // `bloglist`
    res.render('index.ejs',{
      aboutlist: items,
      page: 'about'
    });
  });
});

您还可以在app.locals对象上以相同的方式设置变量。通常,您在设置Express应用期间在app.locals设置非特定于请求的静态值,并在res.locals上设置动态请求特定值。