Ich schreibe derzeit eine API, bei der ein Benutzer ein Authentifizierungstoken im Header jeder Anforderung übergeben muss. Jetzt weiß ich, dass ich eine Sammelroute erstellen kann
app.get('/*', function(req,res){
});
aber ich habe mich gefragt, wie ich es so mache, dass bestimmte Routen wie /login
oder ausgeschlossen werden /
?
Antworten:
Ich bin nicht sicher, was passieren soll, wenn ein Benutzer auf
/login
oder zugreift/
, aber Sie können separate Routen für diese erstellen. Wenn Sie sie vor dem Catch-All deklarieren, erhalten sie erste Dibs bei der Bearbeitung der eingehenden Anforderungen:app.get('/login', function(req, res) { ... }); app.get('/', function(req, res) { ... }); app.get('*', function(req, res) { ... });
quelle
app.use
(um die anderen Methoden einzuschließen).app.use('*', ...)
funktionieren sollte.app.all('*', ...)
In diesem Fall ist jedoch die Verwendung vorzuziehen.app.use
Fügt Middleware hinzu, die die Anforderung standardmäßig an den nächsten Handler in der Kette weiterleitet (unter Verwendung eines zusätzlichen Argumentsnext
).Sie können jederzeit eine Sammelroute nach den Routen platzieren, die Sie ausschließen möchten (siehe robertklep- Antwort).
Aber manchmal möchten Sie sich einfach nicht um die Reihenfolge Ihrer Routen kümmern. In diesem Fall können Sie immer noch tun, was Sie wollen:
app.get('*', function(req, res, next) { if (req.url === '/' || req.url === '/login') return next(); ... });
quelle
next()
, um die Ausführung an die nächste Middleware weiterzuleiten, oder eine Antwort senden, um die Verarbeitung der Anforderung abzuschließen . Andernfalls bleibt die Anfrage hängen. Wenn die letzte Middleware im Stack aufgerufennext()
wird, sendet Express die Standardantwort "404 Not Found". Anstattnext()
anzurufen , können Sie beispielsweise anrufenres.status(400).end()
, um die Anforderungsverarbeitung mit einer Antwort "400 Bad Request" abzuschließen.Wenn Sie Anmeldeinformationen oder Authentizität in jeder Anforderung überprüfen möchten, sollten Sie die Express-Routing-Funktion "all" verwenden. Sie können sie folgendermaßen verwenden:
app.all('/api/*', function(req, res, next){ console.log('General Validations'); next(); });
Sie können es vor jedem Routing-Material platzieren.
Beachten Sie, dass ich in diesem Fall "/ api / " als Pfad verwendet habe. Sie können "/ " verwenden, wenn es Ihren Anforderungen entspricht.
Ich hoffe, es ist nicht zu spät, hier jemandem zu helfen.
quelle
Eine andere Möglichkeit, einen Catch-All-Route-Handler zu erstellen, ist folgende:
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 });
Dies funktioniert genau wie die (akzeptierte) Antwort von robertklep, bietet Ihnen jedoch weitere Informationen darüber, was der Benutzer tatsächlich angefordert hat. Sie haben jetzt einen Slug
req.params.pageCalled
, um die angeforderte Seite darzustellen, und können den Benutzer zur entsprechenden Seite weiterleiten, wenn Sie mehrere verschiedene Seiten haben.Ein Gotchya, auf das Sie bei diesem Ansatz achten müssen (thx @agmin),
/:pageCalled
fängt nur Routen mit einer einzigen ab/
, sodass Sie keine erhalten/route/1
usw. Verwenden Sie zusätzliche Slugs wie/:pageCalled/:subPageCalled
für mehr Seiten (thx @softcode).quelle
/:pageCalled
wird nur Routen mit einer einzigen fangen/
, so dass Sie nicht bekommen/route/1
usw./:pageCalled/:subPageCalled
etc.?