NodeJS / Express: Was ist "app.use"?


332

In den Dokumenten für das NodeJS- expressModul enthält der Beispielcodeapp.use(...) .

Was ist die useFunktion und wo ist sie definiert?



Diese Art von Fragen kann durch Lesen der Dokumentation beantwortet werden.
Mina

47
Die Dokumentation ist ein bisschen kryptisch für einen Anfänger
KansaiRobot

6
Mögliches Duplikat oben verweist aufeinander
Afrig Aminuddin

1
Die Dokumentation ist völlig unklar
Tessaracter

Antworten:


369

Das App-Objekt wird beim Erstellen des Express-Servers instanziiert. Es verfügt über einen Middleware- Stack , der angepasst werden kann app.configure()(dieser ist in Version 4.x veraltet). .

Um Ihre Middleware einzurichten, können Sie app.use(<specific_middleware_layer_here>)für jede Middleware-Schicht, die Sie hinzufügen möchten, aufrufen (sie kann für alle Pfade generisch sein oder nur für bestimmte Pfade ausgelöst werden, die Ihr Server verarbeitet), und sie wird Ihrem Express- Middleware-Stack hinzugefügt . Middleware-Ebenen können einzeln in mehreren Aufrufen useoder sogar alle gleichzeitig in Reihe mit einem Aufruf hinzugefügt werden . Weitere Informationen finden Sie in der useDokumentation .

Um ein Beispiel für das konzeptionelle Verständnis von Express Middleware zu geben, sieht mein App Middleware Stack (app.stack) folgendermaßen aus, wenn mein App-Objekt als JSON in der Konsole protokolliert wird:

stack: 
   [ { route: '', handle: [Function] },
     { route: '', handle: [Function: static] },
     { route: '', handle: [Function: bodyParser] },
     { route: '', handle: [Function: cookieParser] },
     { route: '', handle: [Function: session] },
     { route: '', handle: [Function: methodOverride] },
     { route: '', handle: [Function] },
     { route: '', handle: [Function] } ]

Wie Sie vielleicht ableiten können, habe ich usw. angerufen app.use(express.bodyParser())und app.use(express.cookieParser())diese Express-Middleware-Ebenen zum Middleware-Stack hinzugefügt. Beachten Sie, dass die Routen leer sind. Dies bedeutet, dass ich beim Hinzufügen dieser Middleware-Ebenen angegeben habe, dass sie auf jeder Route ausgelöst werden. Wenn ich eine benutzerdefinierte Middleware-Schicht hinzugefügt hätte, die nur auf dem Pfad ausgelöst wurde, der /user/:idals Zeichenfolge im routeFeld dieses Middleware-Schicht-Objekts im obigen Stapelausdruck angezeigt würde.

Jede Ebene fügt im Wesentlichen eine Funktion hinzu, die speziell Ihren Flow durch die Middleware behandelt.

ZB durch Hinzufügen bodyParser, sind Sie Ihren Server eingehende Anfragen durch die ausdrückliche Middleware gewährleistet . Das Parsen der eingehenden Anforderungen ist nun Teil des Verfahrens, das Ihre Middleware bei der Verarbeitung eingehender Anforderungen ausführt - alles nur, weil Sie angerufen haben app.use(bodyParser).


116
Vielen Dank. Wäre es für die Express-Leute so schwierig, dies in ihren API-Dokumenten zu erklären?
Ericsoco

4
Sie sagen also, dass beim Empfang einer Anfrage die Daten durch diese Parser geleitet werden, bevor der eigentliche Dienst erreicht wird. Beispiel: Valid Request-> Authentication-> ProcessesRequest-> ServResponse USE würde diese Schritte in einer bestimmten Reihenfolge steuern und nicht parallel ausführen?
Adam Hess

2
Ist also die Abhängigkeitsinjektion von app.use () in Aktion?
Kevin C.

8
Wann wird die an app.use gesendete Funktion aufgerufen? Nach dem Erstellen des Express-Servers oder für jede Anfrage?
Timo Huovinen

5
@ KevinC. Nein, es ist keine Abhängigkeitsinjektion. Es ist eine Plugin-Architektur. Im Allgemeinen wird diese Art von Architektur als Filtersystem / Filterpipeline / Rohr und Filter bezeichnet. In Express ist die Pipe der next()Rückruf, den jede Middleware aufrufen soll, um die Verarbeitung an die nächste Funktion in der Pipeline weiterzuleiten. Das Routing-System (das erste Argument dafür app.use()) ermöglicht es der Pipeline, abhängig von der URL zu verzweigen
slebetman

50

useist eine Methode zum Konfigurieren der Middleware, die von den Routen des Express-HTTP-Serverobjekts verwendet wird. Die Methode ist als Teil von Connect definiert , auf dem Express basiert.

Update Ab Version 4.x ist Express nicht mehr von Connect abhängig .

Die Middleware-Funktionen, die zuvor in Express enthalten waren, befinden sich jetzt in separaten Modulen. Siehe die Liste der Middleware-Funktionen .


3
Und die Online-Dokumente sind hier: senchalabs.org/connect/proto.html#app.use
Alexander Bird

Wäre es effizient, wenn eine Node-Middleware Objekte instanziiert? Würde dies bedeuten, dass diese Middleware bei jeder Anfrage neue Objekte instanziiert? Werden die alten Gegenstände weggeworfen? Zum Beispielapp.use(function(){ var object = new SomeConstructor; next(); })
CMCDragonkai

1
@CMCDragonkai Es ist in Ordnung, Objekte bei jeder Anforderung zu instanziieren. Sie erhalten Müll gesammelt, solange Sie keine Verweise auf die Objekte außerhalb des Bereichs Ihres Anforderungshandlers speichern.
jeff_mcmahan

1
@AlexanderBird Danke für die Links (der erste ist jetzt allerdings kaputt). Für den Datensatz steht am Anfang des Dokuments im zweiten Link "Verwenden Sie das angegebene Middleware-Handle für die angegebene Route, standardmäßig /. Diese" Route "ist der Einhängepunkt für die Middleware, wenn ein anderer Wert als / angegeben wird Die Middleware ist nur wirksam, wenn dieses Segment im Pfadnamen der Anforderung vorhanden ist. Wenn wir beispielsweise eine Funktion unter / admin bereitstellen würden, würde sie unter / admin und / admin / settings aufgerufen, jedoch nicht für /. , oder / posts ". Einfach :)
Adrien Be

40

Jede app.use (Middleware) wird jedes Mal aufgerufen, wenn eine Anfrage an den Server gesendet wird.


7
Ihre Antwort mit einem Satz ist sofort verständlich und hilfreicher als die anderen Erklärungen mit mehreren Absätzen.
StackedAndOverflowed

16

app.use () dient zum Mounten der Middleware-Funktion oder zum Mounten an einem angegebenen Pfad. Die Middleware-Funktion wird ausgeführt, wenn der Basispfad übereinstimmt.

Beispiel: Wenn Sie app.use () in indexRouter.js verwenden, gehen Sie wie folgt vor:

//indexRouter.js

var adsRouter = require('./adsRouter.js');

module.exports = function(app) {
    app.use('/ads', adsRouter);
}

Mounten Sie im obigen Code app.use () den Pfad auf '/ ads' zu adsRouter.js.

Jetzt in adsRouter.js

// adsRouter.js

var router = require('express').Router();
var controllerIndex = require('../controller/index');
router.post('/show', controllerIndex.ads.showAd);
module.exports = router;

In adsRouter.js lautet der Pfad für ads- '/ ads / show' wie folgt und funktioniert dann gemäß controllerIndex.ads.showAd ().

app.use ([Pfad], Rückruf, [Rückruf]): Wir können einen Rückruf hinzufügen.

app.use('/test', function(req, res, next) {

  // write your callback code here.

    });

Ich würde "map" anstelle von "mount" verwenden, was leichter zu verstehen ist.
Jeb50

13

app.use () fungiert als Middleware in Express-Apps. Im Gegensatz zu app.get () und app.post () können Sie app.use () tatsächlich verwenden, ohne die Anforderungs-URL anzugeben. In einem solchen Fall wird es jedes Mal ausgeführt, unabhängig davon, welche URL getroffen wurde.


7

app.use () funktioniert so:

  1. Anforderungsereignis auf der HTTP-Serverinstanz des Knotens ausgelöst.
  2. express macht einen Teil seiner inneren Manipulation mit dem req-Objekt.
  3. Dies ist der Zeitpunkt, an dem Express Dinge ausführt, die Sie mit app.use angegeben haben

was sehr einfach.

Und nur dann erledigt Express den Rest der Dinge wie Routing.


6
app.use(function middleware1(req, res, next){
   // middleware1 logic
}, function middleware1(req, res, next){
   // middleware2 logic
}, ... middlewareN);

app.use ist eine Möglichkeit, Middleware oder eine Kette von Middlewares zu registrieren (oder mehrere Middlewares) oder eine Zwischenroutenlogik ausgeführt wird, abhängig von der Reihenfolge der Middleware-Registrierungssequenz.

Middleware: Formen Kette von Funktionen / Middleware-Funktionen mit 3 Parametern req, res, und weiter zum nächsten . Als nächstes folgt der Rückruf, der sich auf die nächste Middleware-Funktion in der Kette bezieht, und im Fall der letzten Middleware-Funktion der Kette zeigt next auf die erste Middleware-Funktion der nächsten registrierten Middlerare-Kette.


1
Klappt wunderbar !!
Anmol Rai

3

In Express, wenn wir Express aus "Express" importieren und app = express () verwenden; dann App mit allen Funktionen von Express

wenn wir app.use () verwenden

mit jeder Modul- / Middleware-Funktion, die im gesamten Express-Projekt verwendet werden kann


3

app.useist eine Funktion, die Middleware erfordert. Zum Beispiel:

 app.use('/user/:id', function (req, res, next) {
       console.log('Request Type:', req.method);
        next();
     });

Dieses Beispiel zeigt die im /user/:idPfad installierte Middleware-Funktion . Diese Funktion wird für jede Art von HTTP-Anforderung in der ausgeführt/user/:id Pfad ausgeführt.

Es ähnelt dem REST-Webserver. Verwenden Sie einfach different /xx, um verschiedene Aktionen darzustellen.


Vielen Dank für die Antwort, aber da bereits jemand anderes all diese Informationen gesagt hat, werde ich diese nicht positiv bewerten. Ich glaube nicht, dass ich jede Erklärung dafür brauche, was Express usetun kann. Ich musste nur wissen, dass es das war (und jedes Kontextwissen, um zu wissen, wie ich selbst mehr forschen kann).
Alexander Bird

3

app.use ist Woks als Middleware für App-Anfragen. Syntax

app.use('pass request format',function which contain request response onject)

Beispiel

app.use('/',funtion(req,res){
 console.log(all request pass through it);
// here u can check your authentication and other activities.
})

Sie können es auch verwenden, wenn Sie Ihre Anfrage weiterleiten.

app.use('/', roting_object);

2

Middleware ist ein allgemeiner Begriff für Software, die zum "Zusammenkleben" dient. App.use ist also eine Methode zum Konfigurieren der Middleware, zum Beispiel: Analysieren und Behandeln des Anforderungshauptteils: app.use (bodyParser.urlencoded ({erweitert: true) })); app.use (bodyParser.json ()); Es gibt viele Middlewares, die Sie in Ihrer Express-Anwendung verwenden können. Lesen Sie einfach das Dokument: http://expressjs.com/en/guide/using-middleware.html


2

app.use wendet die angegebene Middleware auf den Haupt-App-Middleware-Stack an. Beim Anhängen von Middleware an den Haupt-App-Stack spielt die Reihenfolge der Anhänge eine Rolle. Wenn Sie Middleware A vor Middleware B anhängen, wird Middleware A immer zuerst ausgeführt. Sie können einen Pfad angeben, für den eine bestimmte Middleware gilt. Im folgenden Beispiel wird "Hallo Welt" immer vor "Frohe Feiertage" protokolliert.

const express = require('express')
const app = express()

app.use(function(req, res, next) {
  console.log('hello world')
  next()
})

app.use(function(req, res, next) {
  console.log('happy holidays')
  next()
})

2

Es ermöglicht Ihnen , jede Middleware verwenden ( lesen Sie mehr ) wie body_parser, CORSusw. Middleware können folgende Änderungen vornehmen requestund responseObjekte. Es kann auch einen Code ausführen.


Vielen Dank für die Antwort, aber ich glaube, all diese Informationen sind bereits in anderen Antworten erfasst
Alexander Bird

2

Sie können auch Ihre eigene Middleware-Funktion wie erstellen

app.use( function(req, res, next) {
  // your code 
  next();
})

Es enthält drei Parameter req, res,next
können Sie es auch für die Authentifizierung verwenden und Validierung von Eingabe params Ihren Controller sauber zu halten.

next()wird verwendet, um zur nächsten Middleware oder Route zu gelangen.
Sie können die Antwort von der Middleware senden


1

Binden Sie Middleware auf Anwendungsebene mithilfe der Funktionen app.use () und app.METHOD () an eine Instanz des App-Objekts, wobei METHOD die HTTP-Methode der Anforderung ist, die von der Middleware-Funktion verarbeitet wird (z. B. GET, PUT oder POST) in Kleinbuchstaben.


1

Kurz gesagt, app.use () unterstützt alle Arten von Anforderungen [z. B. get, post, ...] und wird daher hauptsächlich zum Einrichten von Middware verwendet. oder kann verwendet werden, wenn die Routen und Funktionen getrennt sind

Beispiel:

app.use("/test",functionName)

und functionName befindet sich in einer anderen Datei


Vielen Dank für die Antwort, aber ich glaube, dass all diese Informationen bereits in anderen Antworten erfasst sind.
Alexander Bird

1

app.use() ist eine Middleware-Methode.

Die Middleware-Methode ist wie ein Interceptor in Java. Diese Methode wird immer für alle Anforderungen ausgeführt.

Zweck und Verwendung von Middleware: -

  1. Um zu überprüfen, ob die Sitzung abgelaufen ist oder nicht
  2. zur Benutzerauthentifizierung und -autorisierung
  3. auf Cookies prüfen (Ablaufdatum)
  4. Analysieren Sie die Daten vor der Antwort

Middleware ist die Funktion, die an app.use () übergeben wird.
NattyC

1

app.use
wird von express (nodejs Middleware Framework) erstellt.
app.use wird verwendet, um eine bestimmte Abfrage im Intilisierungsprozess auszuführen.
server.js (Knoten)
var app = require ('express'); Daher wird die Funktion app.use jedes Mal aufgerufen, wenn der Server hochgefahren ist
app.use(bodyparser.json())


0

app.use ist Middleware auf Anwendungsebene

Binden Sie Middleware auf Anwendungsebene mithilfe der Funktionen app.use () und app.METHOD () an eine Instanz des App-Objekts, wobei METHOD die HTTP-Methode der Anforderung ist, die von der Middleware-Funktion verarbeitet wird (z. B. GET, PUT oder POST) in Kleinbuchstaben.

Sie können alle Anforderungen überprüfen. Sie möchten beispielsweise das Token / Zugriffstoken überprüfen, das Sie zum Schreiben einer Middleware benötigen, indem Sie app.use verwenden, um das Token in der Anforderung zu überprüfen.

Dieses Beispiel zeigt eine Middleware-Funktion ohne Mount-Pfad. Die Funktion wird jedes Mal ausgeführt, wenn die App eine Anfrage erhält.

var app = express()

app.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

Referenz von https://expressjs.com/en/guide/using-middleware.html


app.use () ist keine Middleware. Middleware ist die Funktion, die an app.use () übergeben wird
NattyC
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.