在app.router之后添加中间件

时间:2013-10-27 00:37:03

标签: node.js express

我有一台定义了以下内容的服务器:

app.get('/', function(req, res) {
  // gets something
}

app.post('/', function(req, res) {
  // updates something, need to be authenticated
}

现在我希望post操作仅适用于经过身份验证的用户,因此我想在它们之间添加auth中间件,如下所示:

app.get('/', function(req, res) {
  // gets something
}

app.use('/', function(req, res) {
  // check for authentication
}

app.post('/', function(req, res) {
  // updates something, need to be authenticated
}

这样,GET即可通过,POST用户必须经过身份验证。

问题是express不会进入我的app.use中间件。如果我将app.use中间件放在所有app.VERB路由之前,它就可以工作。

有没有办法像我想的那样去做?

2 个答案:

答案 0 :(得分:4)

当您声明第一条路线时,Express会自动将app.router插入中间件链。由于路由器可以处理任何后续路由,因此在第一条路由之后声明的任何中间件都无法处理您的路由。

但是,您可以使用路由处理程序与中间件非常相似的事实,而不是使用app.use

app.get('/', function(req, res) {
  // gets something
});

app.all('/', function(req, res, next) { // catches GET, POST, ... to '/'
  // check for authentication
});

app.post('/', function(req, res) {
  // updates something, need to be authenticated
});

但是如果你只有一条需要通过中间件传递的路由,那么遵循@hiattp的建议并立即将中间件添加到路由声明中是有意义的。

答案 1 :(得分:2)

我喜欢将这种类型的检查放在可重用的方法中并将其传递给路由处理程序:

function ensureAuth(req, res, next){
  if(req.user) next(); // Auth check
  else res.redirect('/');
}

app.post('/', ensureAuth, function(req,res){
  // User is authenticated
}