Eine kurze Analyse der Fehlerbehandlungs-Middleware von Express in Node
Dieser Artikel führt Sie durch die Fehlerbehandlungs-Middleware von Express in Node und stellt die Methode zur Definition der Fehlerbehandlungs-Middleware und deren Verwendung mit async/await vor. Ich hoffe, dass er für alle hilfreich ist!
Die Fehlerbehandlungs-Middleware von Express hilft Ihnen, mit Fehlern umzugehen, ohne die gleiche Arbeit wiederholen zu müssen. Angenommen, Sie behandeln Fehler direkt im Express-Route-Handler:
app.put('/user/:id', async (req, res) => { let user try { user = await User.findOneAndUpdate({ _id: req.params.id }, req.body) } catch (err) { return res.status(err.status || 500).json({ message: err.message }) } return res.json({ user }) })
Der obige Code funktioniert gut, aber wenn es Hunderte von Schnittstellen gibt, wird die Fehlerbehandlungslogik nicht mehr zu warten, da sie hunderte Male wiederholt wird.
Middleware zur Fehlerbehandlung definieren
Express ist entsprechend der Anzahl der von der Middleware-Funktion verwendeten Parameter in verschiedene Typen unterteilt. Die Middleware-Funktion, die 4 Parameter akzeptiert, ist als „Fehlerbehandlungs-Middleware“ definiert und wird nur aufgerufen, wenn ein Fehler auftritt. const app = require('express')()
app.get('*', function routeHandler() {
// 此中间件抛出一个错误,Express 将直接转到下一个错误处理程序
throw new Error('Oops!')
})
app.get('*', (req, res, next) => {
// 此中间件不是错误处理程序(只有3个参数),Express 将跳过它,因为之前的中间件中存在错误
console.log('这里不会打印')
})
// 您的函数必须接受 4 个参数,以便 Express 将其视为错误处理中间件。
app.use((err, req, res, next) => {
res.status(500).json({ message: err.message })
})
Express behandelt automatisch Synchronisierungsfehler für Sie, wie z. B. die obige Methode routeHandler()
. Express verarbeitet jedoch keine asynchronen Fehler. Wenn ein asynchroner Fehler auftritt, muss next()
aufgerufen werden.
const app = require('express')() app.get('*', (req, res, next) => { // next() 方法告诉 Express 转到链中的下一个中间件。 // Express 不处理异步错误,因此您需要通过调用 next() 来报告错误。 setImmediate(() => { next(new Error('Oops')) }) }) app.use((err, req, res, next) => { res.status(500).json({ message: err.message }) })
Bitte denken Sie daran, dass die Express-Middleware sequentiell ausgeführt wird. Sie sollten Fehlerhandler zuletzt definieren, nach allen anderen Middleware. Andernfalls wird Ihr Fehlerhandler nicht aufgerufen: routeHandler()
方法。但是 Express 不处理异步错误。如果出现异步错误,则需要调用 next()
。
const app = require('express')() app.get('*', (req, res, next) => { // 报告异步错误必须通过 next() return new Promise((resolve, reject) => { setImmediate(() => reject(new Error('woops'))) }).catch(next) }) app.use((error, req, res, next) => { console.log('will not print') res.json({ message: error.message }) }) app.listen(3000)
请记住,Express 中间件是按顺序执行的。您应该在所有其他中间件之后,最后定义错误处理程序。否则,您的错误处理程序将不会被调用:
与 async/await
一起使用
Express 无法捕获 promise
的异常,Express 在 ES6 之前编写,对于如何处理 async/await
它扔没有好的解决方案。
例如,下面的服务器永远不会成功发送 HTTP 响应,因为 Promise reject
永远不会得到处理:
function wrapAsync(fn) { return function(req, res, next) { fn(req, res, next).catch(next) } } app.get('*', wrapAsync(async (req, res) => { await new Promise(resolve => setTimeout(() => resolve(), 50)) // Async error! throw new Error('woops') }))
我们可以封装或者使用现有的库来进行捕获。
首先,我们先简单封装一个函数,将 async/await
与 Express 错误处理中间件联系起来。
注意:异步函数会返回 Promise,因此您需要确保
catch()
所有错误并将其传递给next()
。
require('express-async-errors') app.get('*', async (req, res, next) => { await new Promise((resolve) => setTimeout(() => resolve(), 50)) throw new Error('woops') })
使用第三方库 express-async-errors
,一个简单的 ES6 async/await 支持 hack:
最后
Express 错误处理中间件允许您以最大化关注点分离的方式处理错误。您不需要处理业务逻辑中的错误,如果使用 async/await
,甚至不需要 try/catch
Verwendung mit async/await
Express kann promise
-Code> nicht abfangen Ausnahme: Express wurde vor ES6 geschrieben und es gibt keine gute Lösung für den Umgang mit async/await
, den es auslöst. Zum Beispiel wird der folgende Server die HTTP-Antwort nie erfolgreich senden, da das Promise reject
nie verarbeitet wird:
async/await
mit der Express-Fehlerbehandlungs-Middleware zu verbinden. 🎜🎜🎜Hinweis🎜: Asynchrone Funktionen geben Promise zurück, Sie müssen also sicherstellen, dass alle Fehlerrrreee🎜Verwenden Sie Bibliotheken von Drittanbieterncatch()
sind und annext()
übergeben werden. 🎜
express-async-errors
🎜, ein einfacher ES6-Async/Await-Support-Hack: 🎜rrreeeEndlich 🎜🎜Express-Fehlerbehandlungs-Middleware ermöglicht Sie können mit Fehlern auf eine Art und Weise umgehen, die eine größtmögliche Trennung der Anliegen ermöglicht. Sie müssen keine Fehler in Ihrer Geschäftslogik behandeln oder sogar try/catch
, wenn Sie async/await
verwenden. Diese Fehler werden in Ihrem Fehlerbehandler angezeigt, der dann entscheiden kann, wie auf die Anfrage reagiert wird. Nutzen Sie diese leistungsstarke Funktion unbedingt in Ihrer nächsten Express-App! 🎜🎜Weitere Informationen zu Knoten finden Sie unter: 🎜nodejs-Tutorial🎜! 🎜
Das obige ist der detaillierte Inhalt vonEine kurze Analyse der Fehlerbehandlungs-Middleware von Express in Node. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

JavaScriptisnotbuiltoncorc; Es ist angehört, dass sich JavaScriptWasdedeSthatrunsonGineoFtencninc.

JavaScript kann für die Entwicklung von Front-End- und Back-End-Entwicklung verwendet werden. Das Front-End verbessert die Benutzererfahrung durch DOM-Operationen, und die Back-End-Serveraufgaben über node.js. 1. Beispiel für Front-End: Ändern Sie den Inhalt des Webseitentextes. 2. Backend Beispiel: Erstellen Sie einen Node.js -Server.

Die Auswahl von Python oder JavaScript sollte auf Karriereentwicklung, Lernkurve und Ökosystem beruhen: 1) Karriereentwicklung: Python ist für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet, während JavaScript für die Entwicklung von Front-End- und Full-Stack-Entwicklung geeignet ist. 2) Lernkurve: Die Python -Syntax ist prägnant und für Anfänger geeignet; Die JavaScript -Syntax ist flexibel. 3) Ökosystem: Python hat reichhaltige wissenschaftliche Computerbibliotheken und JavaScript hat ein leistungsstarkes Front-End-Framework.

Die Kraft des JavaScript -Frameworks liegt in der Vereinfachung der Entwicklung, der Verbesserung der Benutzererfahrung und der Anwendungsleistung. Betrachten Sie bei der Auswahl eines Frameworks: 1. Projektgröße und Komplexität, 2. Teamerfahrung, 3. Ökosystem und Community -Unterstützung.

Einführung Ich weiß, dass Sie es vielleicht seltsam finden. Was genau muss JavaScript, C und Browser tun? Sie scheinen nicht miteinander verbunden zu sein, aber tatsächlich spielen sie eine sehr wichtige Rolle in der modernen Webentwicklung. Heute werden wir die enge Verbindung zwischen diesen drei diskutieren. In diesem Artikel erfahren Sie, wie JavaScript im Browser ausgeführt wird, die Rolle von C in der Browser -Engine und wie sie zusammenarbeiten, um das Rendern und die Interaktion von Webseiten voranzutreiben. Wir alle kennen die Beziehung zwischen JavaScript und Browser. JavaScript ist die Kernsprache der Front-End-Entwicklung. Es läuft direkt im Browser und macht Webseiten lebhaft und interessant. Haben Sie sich jemals gefragt, warum Javascr

Node.js zeichnet sich bei effizienten E/A aus, vor allem bei Streams. Streams verarbeiten Daten inkrementell und vermeiden Speicherüberladung-ideal für große Dateien, Netzwerkaufgaben und Echtzeitanwendungen. Die Kombination von Streams mit der TypeScript -Sicherheit erzeugt eine POWE

Die Unterschiede in der Leistung und der Effizienz zwischen Python und JavaScript spiegeln sich hauptsächlich in: 1 wider: 1) Als interpretierter Sprache läuft Python langsam, weist jedoch eine hohe Entwicklungseffizienz auf und ist für eine schnelle Prototypentwicklung geeignet. 2) JavaScript ist auf einen einzelnen Thread im Browser beschränkt, aber Multi-Threading- und Asynchronen-E/A können verwendet werden, um die Leistung in Node.js zu verbessern, und beide haben Vorteile in tatsächlichen Projekten.

JavaScript stammt aus dem Jahr 1995 und wurde von Brandon Ike erstellt und realisierte die Sprache in C. 1.C-Sprache bietet Programmierfunktionen auf hoher Leistung und Systemebene für JavaScript. 2. Die Speicherverwaltung und die Leistungsoptimierung von JavaScript basieren auf C -Sprache. 3. Die plattformübergreifende Funktion der C-Sprache hilft JavaScript, auf verschiedenen Betriebssystemen effizient zu laufen.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

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

Heißer Artikel

Heiße Werkzeuge

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

PHPStorm Mac-Version
Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool

SecLists
SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.
