Unterschiede zwischen express.Router und app.get?


264

Ich beginne mit NodeJS und Express 4 und bin etwas verwirrt. Ich habe die Express-Website gelesen, kann aber nicht sehen, wann ich einen Routenhandler oder wann ich ihn verwenden soll express.Router.

Wie ich sehen konnte, sollte ich Folgendes verwenden, wenn ich eine Seite oder etwas anzeigen möchte, wenn der Benutzer /showzum Beispiel trifft :

var express = require('express')    
var app = express()    
app.get("/show", someFunction)  

Am Anfang dachte ich, das sei alt (für Express 3). Ist das richtig oder ist das auch der Weg für Express 4?

Wenn dies in Express 4 der Fall ist, wofür wird es express.Routerverwendet?

Ich habe fast das gleiche Beispiel wie oben gelesen, aber mit express.Router:

var express = require('express');
var router = express.Router();
router.get("/show", someFunction)

Was ist der Unterschied zwischen beiden Beispielen?

Welches sollte ich verwenden, wenn ich nur eine einfache Testwebsite erstellen möchte?


27
A Routernicht .listen()für Anfragen für sich. Es ist nützlich, um Ihre Anwendung in mehrere Module zu unterteilen - um Routerin jedem eine appDose require()und .use()als Middleware zu erstellen .
Jonathan Lonowski

5
Wie @JonathanLonowski angedeutet hat, ist die app.get(..)Syntax nur eine Abkürzung, um das Arbeiten mit express.routerbequemer zu gestalten. Wenn Sie gerade erst anfangen, machen Sie sich keine Sorgen über die Besonderheiten des Routers.
Soulprovidr

1
Sie sagen also, dass ich im Moment nur app.get () verwenden soll? immer noch verwirrt darüber, wann man das eine oder andere benutzen soll
nelson687

11
@ nelson687 Es gibt nicht wirklich eine feste Regel zwischen ihnen. Wenn Sie der Meinung sind, dass die app'seigenen Routing-Methoden app.get()für Ihre Anforderungen ausreichend sind, verwenden Sie sie. Das Routerdient nur der Vereinfachung, damit Sie die Anwendung über mehrere Module hinweg organisieren können. Aus dem Handbuch : " Mit der express.RouterKlasse können modular montierbare Routenhandler erstellt werden. Eine RouterInstanz ist eine vollständige Middleware und ein Routing-System. Aus diesem Grund wird sie häufig als" Mini-App "bezeichnet. "
Jonathan Lonowski

Antworten:


323

app.js.

var express = require('express'),
    dogs    = require('./routes/dogs'),
    cats    = require('./routes/cats'),
    birds   = require('./routes/birds');

var app = express();

app.use('/dogs',  dogs);
app.use('/cats',  cats);
app.use('/birds', birds);

app.listen(3000);

dogs.js

var express = require('express');

var router = express.Router();

router.get('/', function(req, res) {
    res.send('GET handler for /dogs route.');
});

router.post('/', function(req, res) {
    res.send('POST handler for /dogs route.');
});

module.exports = router;

Beim var app = express()Aufruf wird ein App-Objekt zurückgegeben. Betrachten Sie dies als die Haupt-App .

Beim var router = express.Router()Aufruf wird eine etwas andere Mini-App zurückgegeben. Die Idee hinter der Mini-App ist, dass jede Route in Ihrer App ziemlich kompliziert werden kann und Sie davon profitieren würden, den gesamten Code in eine separate Datei zu verschieben. Der Router jeder Datei wird zu einer Mini-App , die der Haupt-App sehr ähnlich ist .

Im obigen Beispiel wurde der Code für die Route / dog in eine eigene Datei verschoben, damit die Haupt-App nicht überladen wird . Der Code für / Katzen und / Vögel würde in ihren eigenen Dateien ähnlich strukturiert sein. Indem Sie diesen Code in drei Mini-Apps aufteilen , können Sie die Logik für jede einzelne isoliert bearbeiten, ohne sich Gedanken darüber machen zu müssen, wie sich dies auf die beiden anderen auswirkt.

Wenn Sie Code (Middleware) haben, der sich auf alle drei Routen bezieht, können Sie ihn vor den Aufrufen in die Haupt-App einfügen app.use(...). Wenn Sie Code (Middleware) haben, der sich nur auf eine dieser Routen bezieht, können Sie ihn nur für diese Route in die Datei einfügen.


sollten Sie das App-Objekt nicht weitergeben müssen, app.use('/dogs', dogs)(app)da Sie dort Routen definieren, zusätzlich (und korrigieren Sie mich, wenn ich falsch liege), wenn Sie dies auf diese Weise tun, hat das App-Objekt die gesamte zuvor platzierte Middleware darauf und zusätzliches Middleware wird dem App-Objekt hinzugefügt (vorausgesetzt, es befindet sich mehr Middleware auf der Hunderoute). Wenn Sie es verwenden route.get('/dogs', route), wird die Middleware nur an das App-Objekt übergeben, wenn Sie mit den in diesem Router definierten Routen interagieren. Wenn sich der Anwendungsbereich außerhalb der Route befindet, hat es keinen Zugriff auf diese Middleware.
Ravenous

1
Sie müssen die App nicht an die Route übergeben, da die Route mit an die App übergeben wird app.use('/dogs', show). Auf diese Weise ist die Route unabhängig von der App und kann in jeder Express-App wiederverwendet werden. Middleware, die irgendwo platziert wird, bevor eine Route von dieser Route verwendet wird. Wenn Sie Middleware über alle Routen in app.js platzieren, verwenden alle Routen diese Middleware. Wenn Sie Middleware in eine Routendatei (dogs.js) einfügen, wird diese nur von dieser Route verwendet. Wenn Sie Middleware nach der GET-Route in dogs.js platzieren, wird sie nur von der POST-Route verwendet (sofern sie mit einer Antwort endet).
Nocturno

Ahh mein schlechtes. Ich wollte sagen, app.get('/dogs'dogs,)(app)da die Frage über die Get-Funktion von app.get und route.get war. Sie haben gezeigt, wie Sie die Routen trennen, um sie überschaubar zu machen. Aber wäre meine Anakdote nicht richtig, wenn wir darüber sprechen app.get? Wenn ich auf einen PC komme, werde ich meinen obigen Kommentar bearbeiten.
Ravenous

2
Meine App funktioniert immer noch, wenn ich entweder express.Router () oder express () verwende. Ich konnte den Unterschied nicht verstehen :(
Ajay Suwalka

3
@ Ajay Suwalka Ich weiß nicht, wie ich noch näher auf das eingehen kann, was ich bereits gesagt habe. In den Dokumenten heißt es: "Ein Router-Objekt ist eine isolierte Instanz von Middleware und Routen." Ich mag auch den Kommentar von @Jonathan Lonowski oben: "A Routerist nicht .listen()für Anfragen alleine". Das könnte der Hauptunterschied sein.
Nocturno

29

Express 4.0 wird mit dem neuen Router geliefert. Wie auf der Website erwähnt:

Mit der Klasse express.Router können modulare, montierbare Routenhandler erstellt werden. Eine Router-Instanz ist ein vollständiges Middleware- und Routing-System. Aus diesem Grund wird es oft als "Mini-App" bezeichnet.

Unter https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4 gibt es einen guten Artikel, der die Unterschiede beschreibt und beschreibt, was mit Routern gemacht werden kann.

Zusammenfassen

Mit Routern können Sie Ihren Code einfacher modularisieren. Sie können Router verwenden als:

  1. Grundlegende Routen: Home, About
  2. Leiten Sie Middleware weiter, um Anforderungen an die Konsole zu protokollieren
  3. Route mit Parametern
  4. Routen Sie Middleware für Parameter, um bestimmte Parameter zu validieren
  5. Überprüft einen Parameter, der an eine bestimmte Route übergeben wird

Hinweis:

Das app.routerObjekt, das in Express 4 entfernt wurde, hat in Express 5 ein Comeback erlebt. In der neuen Version ist es nur ein Verweis auf den Basis-Express-Router, anders als in Express 3, wo eine App ihn explizit laden musste.


7
app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Post a random book')
  })

Wie im obigen Beispiel können wir unter einer Route verschiedene HTTP-Anforderungsmethoden hinzufügen.


5

Angenommen, Ihre Anwendung ist wenig komplex. Als erstes teilen wir die Anwendung in mehrere Module auf, damit Änderungen in einem Modul die anderen nicht überladen und Sie weiter an einzelnen Modulen arbeiten können. Letztendlich müssen Sie jedoch alles in ein Modul integrieren, seit Sie erstellen eine einzelne Anwendung. Es ist, als hätten wir eine Hauptanwendung und wenige untergeordnete Anwendungen, deren übergeordnete Anwendung die Hauptanwendung ist. Wenn wir also die übergeordnete Anwendung erstellen, erstellen wir eine mit

var express = require('express');
var parent = express();

Und zu dieser übergeordneten Anwendung müssen wir die untergeordneten Anwendungen einbringen. Da es sich bei den untergeordneten Anwendungen jedoch nicht um völlig unterschiedliche Anwendungen handelt (da sie im selben Kontext-Java-Begriff ausgeführt werden), bietet Express die Möglichkeit, dies mithilfe der Router-Funktion des Expresse zu tun. Dies tun wir in den einzelnen untergeordneten Moduldateien und Rufen wir ein solches untergeordnetes Modul als aboutme auf .

var express = require('express');
var router = express.Router();
/**
** do something here
**/
module.exports = router;

Mit module.exports stellen wir dieses Modul anderen zur Verfügung, und da wir Dinge modularisiert haben, müssen wir die Moduldateien der übergeordneten Anwendung mithilfe der Anforderungsfunktion des Knotens wie alle anderen Module von Drittanbietern zur Verfügung stellen, und die übergeordnete Datei sieht aus etwas wie das.

var express = require('express') 
var parent = express() 
var child = require(./aboutme)

Nachdem wir dieses untergeordnete Modul dem übergeordneten Modul zur Verfügung gestellt haben, müssen wir der übergeordneten Anwendung mitteilen, wann diese untergeordnete Anwendung verwendet werden soll. Nehmen wir an, wenn ein Benutzer den Pfad trifft aboutme wir das Kind Anwendung über mich brauchen die Anfrage zu bearbeiten und wir tun es durch die der Expresse mit Verwendung Methode.

parent.use('/aboutme',  aboutme);

und auf einen Schlag sieht die übergeordnete Datei so aus

var express = require('express');
var parent = express();
var child = require(./aboutme);
/***
**do some stuff here
**/
parent.use('/aboutme',child);

Vor allem kann der Elternteil einen Server starten, wo das Kind nicht kann. Hoffe das klärt sich. Weitere Informationen finden Sie im Quellcode, der einige Zeit in Anspruch nimmt, aber viele Informationen enthält. Danke dir.


1
sollte nicht das parent.use('/aboutme', child)?
Kees de Kooter

2

Die Verwendung von app.js zum Schreiben von Routen bedeutet, dass alle Benutzer darauf zugreifen können, wenn app.js beim Start der Anwendung geladen wird. Durch das Einfügen von Routen in Express.router () - Mini-Apps wird jedoch die Zugänglichkeit geschützt und eingeschränkt.


2

express.Router hat viele Möglichkeiten:

  • Groß- und Kleinschreibung aktivieren: Die /showRoute muss nicht mit der Route übereinstimmen /Show. Dieses Verhalten ist standardmäßig deaktiviert
  • Strenger Routing-Modus: /show/Route nicht gleich /show, dieses Verhalten ist standardmäßig ebenfalls deaktiviert
  • Wir können bestimmten Routen bestimmte Middleware / s hinzufügen

0

Mit einem Wort, Sie express.Routerkönnen im Vergleich zu app.get()Middleware mehr tun , außerdem können Sie ein weiteres Router-Objekt mit definierenexpress.Router()

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.