Nodejs Express隐式中间件应用于所有路由?

时间:2012-04-27 18:55:51

标签: node.js express

我想知道Express是否允许我创建一个默认调用的路由中间件,而不会将其明确地放在app.get()arg列表中?

// NodeJS newb

var data = { title: 'blah' };

// So I want to include this in every route
function a(){
  return function(req, res){
    req.data = data;
  };
};

app.get('/', function(req, res) {
  res.render('index', { title: req.data.title });
};

我知道我可以执行app.set('data', data)并通过路线中的req.app.settings.data访问它。这可能会满足我上面的简单例子。

3 个答案:

答案 0 :(得分:9)

function a(req, res, next){
  req.data = data;
  // Update: based on latest version of express, better use this
  res.locals.data = data;
  next();
};

app.get('/*', a);

请参阅Express docs, Middleware section上的示例。

答案 1 :(得分:4)

您可以创建一种默认方式来调用您所创建的每个视图,而无需为每个新条目显式创建新路由。请查看以下示例:

app.get('/:viewname', function(req, res) {
    res.render(req.params.viewname, { viewname : req.params.viewname});
});

我希望你在期待。

答案 2 :(得分:1)

你也可以这样做:

function my_middleware(req, res, next){
   req.data = data;

   if (something(res)) redirect('http://google.com'); // no access to your site
   next(); // go to routes

};

app.configure(function() {
   ...
   app.use(express.cookieParser('secret'));
   app.use(express.session());
   app.use(my_middleware);
   app.use(app.router);
   ...
}

在这种情况下,当cookie和会话已经可用时调用my_middleware,但尚未处理任何路由。或者你甚至可以在会议之前做这个,如果你出于某种原因需要它。