2

我有一个定义如下的服务器:

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路由之前,它就可以工作。

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

4

2 回答 2

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 的建议并立即将中间件添加到路由声明中是有意义的。

于 2013-10-27T06:51:22.100 回答
2

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

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

app.post('/', ensureAuth, function(req,res){
  // User is authenticated
}
于 2013-10-27T01:26:02.163 回答