Złap całą trasę Z WYJĄTKIEM / login


85

Obecnie piszę interfejs API, który będzie wymagał od użytkownika przekazania tokenu uwierzytelniania w nagłówku każdego żądania. Teraz wiem, że mogę utworzyć trasę typu catchall, powiedz

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

});

ale zastanawiałem się, jak to zrobić, aby wykluczało pewne trasy, takie jak /loginlub /?


1
Np. Wymagaj uwierzytelnienia na wszystkich trasach z wyjątkiem / login i / register . (Ponieważ ludzie zastanawiają się, dlaczego zadałeś to pytanie)
a20

Odpowiedzi:


127

Nie jestem pewien, co chcesz zrobić, gdy użytkownik uzyskuje dostęp do /loginlub /, ale możesz utworzyć dla nich oddzielne trasy; jeśli zadeklarujesz je przed catch-all, otrzymają pierwszeństwo przy obsłudze przychodzących żądań:

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

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

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

1
To działałoby tylko dla „GET”, prawda? Z jakiegoś powodu nie mogę uzyskać tej odpowiedzi do pracy app.use(aby uwzględnić inne metody).
SSH

4
@SSH To myślę, że z najnowszą wersją Express (v4) app.use('*', ...)powinno również działać. Ale app.all('*', ...)w tym przypadku lepiej jest używać .
robertklep

@JulienMartin właśnie przetestowany, wygląda na to, że działa zgodnie z oczekiwaniami z Express v4.16.3
robertklep

app.usedodaje oprogramowanie pośredniczące, które zgodnie z projektem przeważnie przekazuje żądanie do następnego programu obsługi w łańcuchu (przy użyciu dodatkowego argumentu next).
Stijn de Witt

45

Zawsze możesz umieścić trasę typu catch-all po tych, które chcesz wykluczyć (patrz odpowiedź robertklep ).

Ale czasami po prostu nie chcesz przejmować się kolejnością swoich tras. W takim przypadku nadal możesz robić, co chcesz:

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

1
.get ('*', function (req, res, next).
Oliver Dixon

2
@iLoveUnicorns thanx! Dlaczego po prostu nie wyedytowałeś mojego posta?
Leonid Beschastny

Jeśli inne reguły są przed tą, czy trzeba dzwonić dalej?
Sandburg

1
Oprogramowanie pośredniczące @Sandburg powinno albo wywołać, next()aby przekazać wykonanie do następnego oprogramowania pośredniego, albo wysłać odpowiedź, aby zakończyć przetwarzanie żądania. W przeciwnym razie żądanie się zawiesi. Jeśli wywołane ostatnie oprogramowanie pośredniczące w stosie, next()express wyśle ​​domyślną odpowiedź „404 Not Found”. Zamiast dzwonić, next()możesz na przykład zadzwonić res.status(400).end()do zakończenia przetwarzania żądania z odpowiedzią „400 Bad Request”.
Leonid Beschastny

24

Jeśli chcesz sprawdzić poświadczenia lub autentyczność w każdym żądaniu, powinieneś użyć funkcji Express Routing „all”, możesz jej użyć w następujący sposób:

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

Możesz umieścić to przed jakimkolwiek routingiem.

Zauważ, że w tym przypadku jako ścieżki użyłem „/ api / ”, możesz użyć „/ ", jeśli pasuje do twoich potrzeb.

Mam nadzieję, że nie jest za późno, aby komuś pomóc.


10

Innym sposobem utworzenia programu obsługi trasy typu catch-all jest następujący:

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
});

Działa to dokładnie tak, jak (zaakceptowana) odpowiedź robertklep, ale daje więcej informacji o tym, czego faktycznie zażądał użytkownik. Masz teraz informacje o req.params.pageCalledżądanej stronie i możesz skierować użytkownika do odpowiedniej strony, jeśli masz kilka różnych.

Jedna gotchya, na którą należy uważać (thx @agmin) przy takim podejściu, /:pageCalledbędzie łapać trasy tylko z pojedynczym /, więc nie dostaniesz /route/1, itp. Użyj dodatkowych slugów, takich jak /:pageCalled/:subPageCalleddla większej liczby stron (thx @softcode)


LEPSZY? Naprawdę? Nie sądzisz, że okoliczności dyktują definicję? ;-) Niepowiązane: Ludzie odrzucający głosy bez pozostawienia komentarza: Jak niegrzecznie!
Potherca

15
jest ogromna gotchya z tym podejściem, /:pageCalledzłapie tylko trasy z jednym /, więc nie dostaniesz /route/1itp.
agmin

Ponadto, jeśli nie otoczysz go próbą / złapaniem, pojawi się błąd, jeśli ta strona nie istnieje.
darethas

@agmin, więc czy rozwiązaniem nie byłoby po prostu dodanie /:pageCalled/:subPageCalleditp.?
softcode
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.