Inhaltsverzeichnis
Middleware-Konzept
Das Folgende ist ein Verständnis dafür, wie Middleware durch die funktioniert Implementierung des Middleware-Mechanismus auf zwei Arten.
Heim Web-Frontend Front-End-Fragen und Antworten Was bedeutet Middleware in NodeJS?

Was bedeutet Middleware in NodeJS?

Oct 29, 2021 pm 03:51 PM
nodejs 中间件

In NodeJS bezieht sich Middleware hauptsächlich auf die Methode, die die detaillierte Verarbeitung aller HTTP-Anfragen kapselt. Es handelt sich um die Verarbeitungsmethode von der Einleitung der HTTP-Anfrage bis zum Ende der Antwort. Das Verhalten von Middleware ähnelt dem Funktionsprinzip von Filtern in Java, das darin besteht, den Filter damit zu befassen, bevor er in eine bestimmte Geschäftsverarbeitung eintritt.

Was bedeutet Middleware in NodeJS?

Die Betriebsumgebung dieses Tutorials: Windows7-System, NodeJS-Version 12.19.0, Dell G3-Computer.

Middleware-Konzept

In NodeJS bezieht sich Middleware hauptsächlich auf die Methode, die alle HTTP-Anforderungsdetails kapselt. Eine HTTP-Anfrage erfordert normalerweise viel Arbeit, wie Protokollierung, IP-Filterung, Abfragezeichenfolgen, Analyse des Anforderungstexts, Cookie-Verarbeitung, Berechtigungsüberprüfung, Parameterüberprüfung, Ausnahmebehandlung usw. Bei Webanwendungen ist dies jedoch nicht der Fall ausgesetzt so viel Detailverarbeitung, daher wird Middleware eingeführt, um die Details zwischen dieser Infrastruktur und der Geschäftslogik zu vereinfachen und zu isolieren, sodass sich Entwickler auf die Geschäftsentwicklung konzentrieren können, um den Zweck der Verbesserung der Entwicklungseffizienz zu erreichen.

Das Verhalten von Middleware ähnelt dem Funktionsprinzip von Filtern in Java, das darin besteht, den Filter damit zu befassen, bevor er in eine bestimmte Geschäftsverarbeitung eintritt. Das Arbeitsmodell ist in der folgenden Abbildung dargestellt.

Was bedeutet Middleware in NodeJS?

                                                                       Die Form der Software ist wie folgt:

const middleware = (req, res, next) => {
  // TODO
  next()
}
Nach dem Login kopieren

Das Folgende ist ein Verständnis dafür, wie Middleware durch die funktioniert Implementierung des Middleware-Mechanismus auf zwei Arten.

Methode 1

Definieren Sie drei einfache Middleware wie folgt:

const middleware1 = (req, res, next) => {
  console.log('middleware1 start')
  next()
}

const middleware2 = (req, res, next) => {
  console.log('middleware2 start')
  next()
}

const middleware3 = (req, res, next) => {
  console.log('middleware3 start')
  next()
}
Nach dem Login kopieren
// 中间件数组
const middlewares = [middleware1, middleware2, middleware3]
function run (req, res) {
  const next = () => {
    // 获取中间件数组中第一个中间件
    const middleware = middlewares.shift()
    if (middleware) {
      middleware(req, res, next)
    }
  }
  next()
}
run() // 模拟一次请求发起
Nach dem Login kopieren
Führen Sie den obigen Code aus. Sie können die folgenden Ergebnisse sehen:
middleware1 start
middleware2 start
middleware3 start
Nach dem Login kopieren
Nach dem Login kopieren
Wenn es einen asynchronen Vorgang in der Middleware gibt, muss er bei enden das Ende des asynchronen Operationsprozesses Rufen Sie dann die Methode next() auf, andernfalls kann die Middleware nicht nacheinander ausgeführt werden. Schreiben Sie Middleware2 Middleware neu:

const middleware2 = (req, res, next) => {
  console.log('middleware2 start')  new Promise(resolve => {
    setTimeout(() => resolve(), 1000)
  }).then(() => {
    next()
  })
}
Nach dem Login kopieren

Das Ausführungsergebnis ist das gleiche wie zuvor, aber Middleware3 wird ausgeführt, nachdem Middleware2 asynchron abgeschlossen wurde.

middleware1 start
middleware2 start
middleware3 start
Nach dem Login kopieren
Nach dem Login kopieren

Einige Middleware muss nicht nur vor der Geschäftsverarbeitung ausgeführt werden, sondern auch nach der Geschäftsverarbeitung, z. B. Protokoll-Middleware für statistische Zeit. Bei Methode 1 können andere Codes der aktuellen Middleware nicht als Callbacks ausgeführt werden, wenn next() eine asynchrone Operation ist. Daher können die nachfolgenden Operationen der next()-Methode in ein Promise-Objekt gekapselt werden und die Middleware kann mit next.then()< vervollständigt werden /code>-Formular. Rückruf nach Abschluss der Geschäftsabwicklung. Schreiben Sie die <code>run()-Methode wie folgt um:

function run (req, res) {
  const next = () => {
    const middleware = middlewares.shift()    if (middleware) {      // 将middleware(req, res, next)包装为Promise对象
      return Promise.resolve(middleware(req, res, next))
    }
  }
  next()
}
Nach dem Login kopieren

Die aufrufende Methode der Middleware muss wie folgt umgeschrieben werden: next()方法,否则中间件不能按顺序执行。改写middleware2中间件:

const middleware1 = (req, res, next) => {
  console.log(&#39;middleware1 start&#39;)  // 所有的中间件都应返回一个Promise对象
  // Promise.resolve()方法接收中间件返回的Promise对象,供下层中间件异步控制
  return next().then(() => {
    console.log(&#39;middleware1 end&#39;)
  })
}
Nach dem Login kopieren

执行结果与之前一致,不过middleware3会在middleware2异步完成后执行。

const middleware1 = (req, res, next) => {
    console.log(&#39;middleware1 start&#39;)    // 所有的中间件都应返回一个Promise对象
    // Promise.resolve()方法接收中间件返回的Promise对象,供下层中间件异步控制
    return next().then((res) => {
      console.log("1",res)      return &#39;middleware1 end&#39;;
    })
  }
  
  const middleware2 = (req, res, next) => {
    console.log(&#39;middleware2 start&#39;)    // 所有的中间件都应返回一个Promise对象
    // Promise.resolve()方法接收中间件返回的Promise对象,供下层中间件异步控制
    // console.log("next()",next())
    return next().then((res) => {
      console.log("2",res)      return &#39;middleware2 end&#39;
    })
  }
  const middleware3 = (req, res, next) => {
    console.log(&#39;middleware3 start&#39;)    return next().then((res) => {
      console.log("3",res)      return &#39;middleware3 end&#39;
    })
  }

const middlewares = [middleware1, middleware2, middleware3]function run (req, res) {
    const next = () => {
      const middleware = middlewares.shift()      if (middleware) {        //   console.log("next",next)
        // 将middleware(req, res, next)包装为Promise对象
        return Promise.resolve(middleware(req, res, next))
      }else {        return Promise.resolve("结束");
      }
    }
    next()
  }
run() // 模拟一次请求发起
Nach dem Login kopieren

有些中间件不止需要在业务处理前执行,还需要在业务处理后执行,比如统计时间的日志中间件。在方式一情况下,无法在next()为异步操作时再将当前中间件的其他代码作为回调执行。因此可以将next()方法的后续操作封装成一个Promise对象,中间件内部就可以使用next.then()形式完成业务处理结束后的回调。改写run()方法如下:

const middleware1 = async (req, res, next) => {
    console.log(&#39;middleware1 start&#39;)
    let result = await next();
    console.log("1",result)
  }
  
  const middleware2 = async (req, res, next) => {
    console.log(&#39;middleware2 start&#39;)
    let result = await next();
    console.log("2",result)
    return &#39;middleware2 end&#39;;
  }
  const middleware3 = async (req, res, next) => {
    console.log(&#39;middleware3 start&#39;)
    let result = await next();
    console.log("3",result)
    return &#39;middleware3 end&#39;;
  }

const middlewares = [middleware1, middleware2, middleware3]

function run (req, res) {
    const next = () => {
      const middleware = middlewares.shift()
      if (middleware) {
        //   console.log("next",next)
        // 将middleware(req, res, next)包装为Promise对象
        return Promise.resolve(middleware(req, res, next))
      }else {
        return Promise.resolve("结束");
      }
    }
    next()
  }
run() // 模拟一次请求发起
Nach dem Login kopieren

中间件的调用方式需改写为:

function compose (middleware) {
  if (!Array.isArray(middleware)) throw new TypeError(&#39;Middleware stack must be an array!&#39;)
  for (const fn of middleware) {
    if (typeof fn !== &#39;function&#39;) throw new TypeError(&#39;Middleware must be composed of functions!&#39;)
  }
  return function (context, next) {
    let index = -1
    return dispatch(0)
    function dispatch (i) {
      // index会在next()方法调用后累加,防止next()方法重复调用
      if (i <= index) return Promise.reject(new Error(&#39;next() called multiple times&#39;))
      index = i
      let fn = middleware[i]
      if (i === middleware.length) fn = next
      if (!fn) return Promise.resolve()
      try {
        // 核心代码
        // 包装next()方法返回值为Promise对象
        return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));
      } catch (err) {
        // 遇到异常中断后续中间件的调用
        return Promise.reject(err)
      }
    }
  }
}
Nach dem Login kopieren
rrreee

结果:

async await 实现

rrreee

以上描述了中间件机制中多个异步中间件的调用流程,实际中间件机制的实现还需要考虑异常处理、路由等。

express框架中,中间件的实现方式为方式一,并且全局中间件和内置路由中间件中根据请求路径定义的中间件共同作用,不过无法在业务处理结束后再调用当前中间件中的代码。koa2框架中中间件的实现方式为方式二,将next()方法返回值封装成一个Promise,便于后续中间件的异步流程控制,实现了koa2框架提出的洋葱圈模型,即每一层中间件相当于一个球面,当贯穿整个模型时,实际上每一个球面会穿透两次。

Was bedeutet Middleware in NodeJS?

koa2中间件洋葱圈模型

koa2rrreeerrreee

Ergebnis:

asynchron warten auf Implementierung

rrreee

🎜🎜Das Obige beschreibt mehrere Aspekte des Middleware-Mechanismus Was den Aufrufprozess der asynchronen Middleware betrifft, müssen bei der tatsächlichen Implementierung des Middleware-Mechanismus auch Ausnahmebehandlung, Routing usw. berücksichtigt werden. 🎜🎜Im express-Framework wird die Middleware in Methode 1 implementiert, und die globale Middleware und die gemäß dem Anforderungspfad in der integrierten Routing-Middleware definierte Middleware arbeiten zusammen, können jedoch nicht verwendet werden Rufen Sie nach Abschluss der Geschäftsverarbeitung den Code in der aktuellen Middleware auf. Die Implementierungsmethode der Middleware im koa2-Framework ist Methode zwei. Der Rückgabewert der next()-Methode ist zur Vereinfachung in ein Promise gekapselt Die nachfolgende asynchrone Prozesssteuerung der Middleware implementiert das vom koa2-Framework vorgeschlagene Zwiebelringmodell, d. h. jede Middlewareschicht entspricht einer Kugel. Wenn sie das gesamte Modell durchdringt, dringt jede Kugel tatsächlich zweimal ein. 🎜

 Was bedeutet Middleware in NodeJS?🎜🎜koa2 Middleware-Zwiebelringmodell🎜🎜koa2 Der Middleware-Mechanismus des Frameworks ist sehr einfach und elegant. Hier lernen wir den Kerncode für die Kombination mehrerer Middlewares im Framework. 🎜rrreee🎜Adresse der Koa-Middleware-Liste: https://github.com/koajs/koa/wiki 🎜🎜Zusammenfassung🎜🎜In diesem Artikel wird hauptsächlich das Konzept der Middleware vorgestellt, warum Middleware eingeführt wird und die Kernimplementierung des Middleware-Mechanismus. Der Middleware-Mechanismus sorgt dafür, dass Webanwendungen eine gute Skalierbarkeit und Zusammensetzbarkeit aufweisen. 🎜

Bei der Implementierung von Middleware sollte eine einzelne Middleware einfach genug sein und eine einzige Verantwortung haben. Da jede Anfrage den Middleware-bezogenen Code aufruft, sollte der Middleware-Code effizient sein und bei Bedarf wiederholt abgerufene Daten zwischenspeichern können. Wenn Sie Middleware für unterschiedliche Routen verwenden, sollten Sie auch berücksichtigen, dass unterschiedliche Middleware für unterschiedliche Routen gilt.

【Empfohlenes Lernen: „nodejs-Tutorial“】

Das obige ist der detaillierte Inhalt vonWas bedeutet Middleware in NodeJS?. 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

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

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 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.

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

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