我目前正在编写一个API,它将要求用户在每个请求的标头中传递身份验证令牌。现在我知道我可以创建一条综合路线了
app.get('/*', function(req,res){
});
但我想知道如何使它排除某些路线,例如/login
或/
?
Answers:
我不确定用户访问/login
或时要发生什么/
,但是您可以为它们创建单独的路由;如果您在全部捕获之前声明它们,则它们在处理传入请求时会首先遇到麻烦:
app.get('/login', function(req, res) {
...
});
app.get('/', function(req, res) {
...
});
app.get('*', function(req, res) {
...
});
app.use
(包括其他方法)。
app.use('*', ...)
应该工作。但是app.all('*', ...)
在这种情况下,最好使用。
app.use
添加了中间件,该中间件在设计上主要将请求传递给链中的下一个处理程序(使用extra参数next
)。
您始终可以将全部路线放置在要排除的路线之后(请参阅robertklep答案)。
但是有时您根本不想关心路线的顺序。在这种情况下,您仍然可以做您想做的事情:
app.get('*', function(req, res, next) {
if (req.url === '/' || req.url === '/login') return next();
...
});
next()
将执行传递给下一个中间件,或者发送一些响应以完成对请求的处理。否则,请求将被挂起。如果堆栈中最后一个调用的中间件,next()
则express将发送默认的“ 404 Not Found”响应。next()
例如,可以通过调用res.status(400).end()
“ 400 Bad Request”响应来完成请求处理,而不是致电。
制作全部路由处理程序的另一种方法是:
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)
/:pageCalled
只赶上与航线单一/
,所以你不会得到/route/1
等等
/:pageCalled/:subPageCalled
etc吗?