Heim Web-Frontend js-Tutorial nodejs arbeitet als nächstes in Express

nodejs arbeitet als nächstes in Express

Apr 18, 2018 am 11:20 AM
express javascript nodejs

Dieses Mal werde ich Ihnen zeigen, welche Vorsichtsmaßnahmen für den Express-Betrieb von NodeJS gelten. Das Folgende ist ein praktischer Fall, schauen wir uns das an.

Ich glaube, dass viele Leute nicht viel über Next in Express in NodeJS wissen. Die meisten Leute wissen nicht, was Next tut und unter welchen Umständen es verwendet wird Einführung dazu. Wenn Sie interessiert sind, lassen Sie uns lernen, wie man es benutzt.

In letzter Zeit verwendet das Unternehmen Node, um das Front-End und das Back-End zu trennen. Daher habe ich vor einiger Zeit einen Artikel über Express-Routing geschrieben, aber es scheint so In diesem Artikel fehlt eine wichtige Sache. Der Inhalt ist der nächste von Express, daher werde ich heute separat über den nächsten von Express sprechen.

Als nächstes werde ich es hauptsächlich anhand von drei Punkten erklären:

  • Welche Funktion hat next?

  • Wann sollten wir als nächstes verwenden?

  • Was ist der interne Implementierungsmechanismus von next?

Die Rolle des Nächsten

Wenn wir die Express-Funktion

Middleware definieren, definieren wir als Nächstes die nächste Funktion, die hauptsächlich für die Übergabe der Steuerung an die nächste Middleware verantwortlich ist Wird die Anfrage von der Software nicht beendet und next nicht aufgerufen, wird die Anfrage angehalten und die später definierte Middleware erhält keine Chance zur Ausführung.

Wann sollte „Weiter“ verwendet werden?

Aus der obigen Beschreibung wissen wir bereits, dass die nächste Funktion hauptsächlich dazu dient, sicherzustellen, dass alle registrierten Middleware nacheinander ausgeführt werden. Dann sollten wir die nächste Funktion in der gesamten Middleware aufrufen, aber es gibt einen Sonderfall, wenn wir die Middleware definieren beendet diese Anfrage, daher sollte die nächste Funktion nicht erneut aufgerufen werden, da es sonst zu Problemen kommen kann

app.get('/a', function(req, res, next) {
  res.send('sucess');
  next();
});
// catch 404 and forward to error handler
app.use(function(req, res, next) {
 console.log(404);
 var err = new Error('Not Found');
 err.status = 404;
 next(err);
});
app.use(function(err, req, res, next) {
 res.status(err.status || 500);
 res.render('error', {
  message: err.message,
  error: {}
 });
});
Nach dem Login kopieren
Senden Sie die Anfrage „/a“, das Konsolendruckprotokoll lautet wie folgt:

404
GET /a 500 6.837 ms - -
Error: Can't set headers after they are sent.
  at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:345:11)
Nach dem Login kopieren
Warum löst der Code eine Ausnahme aus? Das liegt daran, dass wir die nächste Funktion nach res.send aufgerufen haben. Obwohl unsere Anfrage beendet wurde, wird die nachfolgende 404-Middleware weiterhin ausgeführt und versucht, zu res zu gelangen ​auf Header, daher wird die obige Ausnahme ausgelöst.

Nachdem Sie dies gelesen haben, haben Sie möglicherweise eine Frage: Wenn ich die nächste Funktion nach res.send nicht aufrufe, wird die später definierte 404-Middleware nie ausgeführt? Jetzt löschen wir den nächsten Funktionsaufruf nach res.send und senden die Anfrage „/xxx“, wir werden feststellen, dass die 404-Middleware ausgeführt wird, (ㄒoㄒ), steht das nicht im Widerspruch zu dem, was wir zuvor gesagt haben, unsere Anpassung Die Middleware ruft nicht weiter auf, aber die später definierte Middleware wird trotzdem ausgeführt. Warum ist das so? Es scheint, dass wir nur den Quellcode um Hilfe bitten können~~~

Der interne Mechanismus von Next

function next(err) {
  ... //此处源码省略
  // find next matching layer
  var layer;
  var match;
  var route;
  while (match !== true && idx < stack.length) {
   layer = stack[idx++];
   match = matchLayer(layer, path);
   route = layer.route;
   if (typeof match !== 'boolean') {
    // hold on to layerError
    layerError = layerError || match;
   }
   if (match !== true) {
    continue;
   }
   ... //此处源码省略
  }
 ... //此处源码省略
  // this should be done for the layer
  if (err) {
    layer.handle_error(err, req, res, next);
  } else {
   layer.handle_request(req, res, next);
  }
 }
Nach dem Login kopieren
Das Obige ist der Quellcode von next in Express. Um das Problem einfacher zu erklären, wurde der Code gelöscht. Aus dem obigen Quellcode können wir erkennen, dass es in der nächsten Funktion eine

while-Schleife gibt. Jede Schleife entfernt eine Ebene aus dem Stapel. Diese Ebene enthält Routing- und Middleware-Informationen und dann die Ebene Der angeforderte Pfad stimmt überein. Wenn die Übereinstimmung erfolgreich ist, wird „layer.handle_request“ ausgeführt und die Middleware-Funktion aufgerufen. Wenn die Übereinstimmung jedoch fehlschlägt, wird die nächste Ebene (Middleware) in einer Schleife ausgeführt.

Jetzt können wir das oben angesprochene Problem erklären, warum die nächste Funktion in unserer benutzerdefinierten Middleware nicht aufgerufen wird, die nachfolgende 404-Middleware jedoch trotzdem ausgeführt wird, da das von uns angeforderte „/xxx“ nicht mit dem von uns registrierten „/a“ übereinstimmt. leitet die Middleware weiter, sodass die while-Schleife weiterhin ausgeführt wird. Wenn die 404-Middleware erfolgreich abgeglichen wird, wird die 404-Middleware ausgeführt.

Hinweis: Wenn der Pfadparameter für bei app.use registrierte Middleware leer ist, ist er standardmäßig „/“ und Middleware mit dem Pfad „/“ stimmt standardmäßig mit allen Anforderungen überein.

Auf eines muss besonders hingewiesen werden: Wenn wir Routing-

-Middleware definieren, ist der dritte Parameter next der Funktion nicht derselbe wie der dritte Parameter next der Funktion, wenn wir Nicht-Routing-Middleware definieren. Was Sie oben sehen, ist die nächste Funktion der Nicht-Routing-Middleware, und die nächste Funktion der Routing-Middleware ist wie folgt

这个next比上边的那个next要简单很多,它负责同一个路由的多个中间件的控制权的传递,并且它会接收一个参数"route",如果调用next(“route”),则会跳过当前路由的其它中间件,直接将控制权交给下一个路由。

最后有必要再说一说next(err),next(err)是如何将控制权传递到错误处理中间件的,从前边的代码我们知道,当调用next(err)是,express内部会调用layer.handle_error,那我们来看看它的源码

Layer.prototype.handle_error = function handle_error(error, req, res, next) {
 var fn = this.handle;
 if (fn.length !== 4) {
  // not a standard error handler
  return next(error);
 }
 try {
  fn(error, req, res, next);
 } catch (err) {
  next(err);
 }
};
Nach dem Login kopieren

代码中的fn就是中间件函数,express会对fn的参数个数进行判断,如果参数个数不等于4则认为不是错误处理中间件,则继续调用next(err),这样就会进入到下一个中间件函数,继续进行参数个数判断,如此方式一直到某个中间件函数的参数个数是4,就认为找到了错误处理中间件,然后执行此中间件函数。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

Express Session实现登录验证功能(附代码)

js面向对象深入理解

Das obige ist der detaillierte Inhalt vonnodejs arbeitet als nächstes in Express. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Ist NodeJS ein Backend-Framework? Ist NodeJS ein Backend-Framework? Apr 21, 2024 am 05:09 AM

Node.js kann als Backend-Framework verwendet werden, da es Funktionen wie hohe Leistung, Skalierbarkeit, plattformübergreifende Unterstützung, ein umfangreiches Ökosystem und einfache Entwicklung bietet.

So verbinden Sie NodeJS mit der MySQL-Datenbank So verbinden Sie NodeJS mit der MySQL-Datenbank Apr 21, 2024 am 06:13 AM

Um eine Verbindung zu einer MySQL-Datenbank herzustellen, müssen Sie die folgenden Schritte ausführen: Installieren Sie den MySQL2-Treiber. Verwenden Sie mysql2.createConnection(), um ein Verbindungsobjekt zu erstellen, das die Hostadresse, den Port, den Benutzernamen, das Passwort und den Datenbanknamen enthält. Verwenden Sie „connection.query()“, um Abfragen durchzuführen. Verwenden Sie abschließend Connection.end(), um die Verbindung zu beenden.

Was sind die globalen Variablen in NodeJS? Was sind die globalen Variablen in NodeJS? Apr 21, 2024 am 04:54 AM

Die folgenden globalen Variablen sind in Node.js vorhanden: Globales Objekt: global Kernmodul: Prozess, Konsole, erforderlich Laufzeitumgebungsvariablen: __dirname, __filename, __line, __column Konstanten: undefiniert, null, NaN, Infinity, -Infinity

Was ist der Unterschied zwischen den Dateien npm und npm.cmd im Installationsverzeichnis von nodejs? Was ist der Unterschied zwischen den Dateien npm und npm.cmd im Installationsverzeichnis von nodejs? Apr 21, 2024 am 05:18 AM

Es gibt zwei npm-bezogene Dateien im Node.js-Installationsverzeichnis: npm und npm.cmd. Die Unterschiede sind wie folgt: unterschiedliche Erweiterungen: npm ist eine ausführbare Datei und npm.cmd ist eine Befehlsfensterverknüpfung. Windows-Benutzer: npm.cmd kann über die Eingabeaufforderung verwendet werden, npm kann nur über die Befehlszeile ausgeführt werden. Kompatibilität: npm.cmd ist spezifisch für Windows-Systeme, npm ist plattformübergreifend verfügbar. Nutzungsempfehlungen: Windows-Benutzer verwenden npm.cmd, andere Betriebssysteme verwenden npm.

Gibt es einen großen Unterschied zwischen NodeJS und Java? Gibt es einen großen Unterschied zwischen NodeJS und Java? Apr 21, 2024 am 06:12 AM

Die Hauptunterschiede zwischen Node.js und Java sind Design und Funktionen: Ereignisgesteuert vs. Thread-gesteuert: Node.js ist ereignisgesteuert und Java ist Thread-gesteuert. Single-Threaded vs. Multi-Threaded: Node.js verwendet eine Single-Threaded-Ereignisschleife und Java verwendet eine Multithread-Architektur. Laufzeitumgebung: Node.js läuft auf der V8-JavaScript-Engine, während Java auf der JVM läuft. Syntax: Node.js verwendet JavaScript-Syntax, während Java Java-Syntax verwendet. Zweck: Node.js eignet sich für I/O-intensive Aufgaben, während Java für große Unternehmensanwendungen geeignet ist.

Ist NodeJS eine Back-End-Entwicklungssprache? Ist NodeJS eine Back-End-Entwicklungssprache? Apr 21, 2024 am 05:09 AM

Ja, Node.js ist eine Backend-Entwicklungssprache. Es wird für die Back-End-Entwicklung verwendet, einschließlich der Handhabung serverseitiger Geschäftslogik, der Verwaltung von Datenbankverbindungen und der Bereitstellung von APIs.

So stellen Sie das NodeJS-Projekt auf dem Server bereit So stellen Sie das NodeJS-Projekt auf dem Server bereit Apr 21, 2024 am 04:40 AM

Serverbereitstellungsschritte für ein Node.js-Projekt: Bereiten Sie die Bereitstellungsumgebung vor: Erhalten Sie Serverzugriff, installieren Sie Node.js, richten Sie ein Git-Repository ein. Erstellen Sie die Anwendung: Verwenden Sie npm run build, um bereitstellbaren Code und Abhängigkeiten zu generieren. Code auf den Server hochladen: über Git oder File Transfer Protocol. Abhängigkeiten installieren: Stellen Sie eine SSH-Verbindung zum Server her und installieren Sie Anwendungsabhängigkeiten mit npm install. Starten Sie die Anwendung: Verwenden Sie einen Befehl wie node index.js, um die Anwendung zu starten, oder verwenden Sie einen Prozessmanager wie pm2. Konfigurieren Sie einen Reverse-Proxy (optional): Verwenden Sie einen Reverse-Proxy wie Nginx oder Apache, um den Datenverkehr an Ihre Anwendung weiterzuleiten

Welches soll man zwischen NodeJS und Java wählen? Welches soll man zwischen NodeJS und Java wählen? Apr 21, 2024 am 04:40 AM

Node.js und Java haben jeweils ihre Vor- und Nachteile in der Webentwicklung, und die Wahl hängt von den Projektanforderungen ab. Node.js zeichnet sich durch Echtzeitanwendungen, schnelle Entwicklung und Microservices-Architektur aus, während Java sich durch Support, Leistung und Sicherheit auf Unternehmensniveau auszeichnet.

See all articles