捕获/ login以外的所有路由


83

我目前正在编写一个API,它将要求用户在每个请求的标头中传递身份验证令牌。现在我知道我可以创建一条综合路线了

app.get('/*', function(req,res){

});

但我想知道如何使它排除某些路线,例如/login/


例如,在/ login/ register之外的 所有路由上都需要认证。(因为人们想知道你为什么问这个问题)
A20

Answers:


124

我不确定用户访问/login或时要发生什么/,但是您可以为它们创建单独的路由;如果您在全部捕获之前声明它们,则它们在处理传入请求时会首先遇到麻烦:

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

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

app.get('*', function(req, res) {
  ...
});

1
这仅对“ GET”有效吗?由于某种原因,我无法使用此答案app.use(包括其他方法)。
SSH

4
@SSHThis我认为在Express(v4)的最新版本中,它也app.use('*', ...)应该工作。但是app.all('*', ...)在这种情况下,最好使用。
罗伯特克莱普'16

@JulienMartin刚刚经过测试,看起来可以与Express v4.16.3一起正常工作
robertklep

app.use添加了中间件,该中间件在设计上主要将请求传递给链中的下一个处理程序(使用extra参数next)。
Stijn de Witt

45

您始终可以将全部路线放置在要排除的路线之后(请参阅robertklep答案)。

但是有时您根本不想关心路线的顺序。在这种情况下,您仍然可以做您想做的事情:

app.get('*', function(req, res, next) {
  if (req.url === '/' || req.url === '/login') return next();
  ...
});

1
获得( '*',功能(REQ,水库,下一个)。
奥利弗迪克森

2
@iLoveUnicorns thanx!你为什么不编辑我的帖子?
Leonid Beschastny

如果其他规则在该规则之前,是否需要调用下一个规则?
桑德堡

1
@Sandburg中间件应该调用next()将执行传递给下一个中间件,或者发送一些响应以完成对请求的处理。否则,请求将被挂起。如果堆栈中最后一个调用的中间件,next()则express将发送默认的“ 404 Not Found”响应。next()例如,可以通过调用res.status(400).end()“ 400 Bad Request”响应来完成请求处理,而不是致电。
Leonid Beschastny

23

如果要在每个请求中验证凭据或真实性,则应使用“快速路由”功能“ all”,可以这样使用:

app.all('/api/*', function(req, res, next){
    console.log('General Validations');
    next();
});

您可以将其放在任何路由内容之前。

请注意,在这种情况下,我使用“ / api / ”作为路径,可以使用“ / ”来满足您的需要。

希望在这里帮助某人为时不晚。


10

制作全部路由处理程序的另一种方法是:

app.get('/login', function(req, res) {
  //... login page
});
app.get('/', function(req, res) {
  //...index page
});
app.get('/:pageCalled', function(req, res) {
  console.log('retrieving page: ' + req.params.pageCalled);
  //... mypage.html
});

这与robertklep的(接受的)答案完全一样,但是它为您提供了有关用户实际要求的更多信息。现在,您可以拥有一个req.params.pageCalled代表要请求的页面的子控件,并且如果您有多个页面,则可以将用户定向到适当的页面。

一个gotchya要用这种方法提防(thx @agmin),/:pageCalled只会捕获带有单个的路由/,因此您不会得到/route/1,等等。使用/:pageCalled/:subPageCalled更多的子弹,例如获取更多页面(thx @softcode)


更好?真?您难道情况决定了定义吗?;-)不相关:人们不加评论地投票反对:多么粗鲁!
Potherca'3

14
有这种方法的巨大gotchya,/:pageCalled只赶上与航线单一/,所以你不会得到/route/1等等
agmin

另外,如果您未将其括在try / catch中,则如果该页面不存在,则会收到错误消息。
darethas

@agmin所以解决方案不是简单地添加/:pageCalled/:subPageCalledetc吗?
Softcode
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.