Express jest frameworkiem routingu i oprogramowania pośredniczącego, który ma minimalną własną funkcjonalność: Aplikacja Express jest w istocie serią wywołań funkcji middleware.
Funkcje middleware to funkcje, które mają dostęp do obiektu żądania (req
), obiektu odpowiedzi (res
) i następnej funkcji middleware w cyklu żądanie-odpowiedź aplikacji. Następna funkcja middleware jest zwykle oznaczana zmienną o nazwie next
.
Funkcje middleware mogą wykonywać następujące zadania:
- Wykonać dowolny kod.
- Zmienić obiekt żądania i odpowiedzi.
- Zakończyć cykl żądanie-odpowiedź.
- Wywołać następną funkcję middleware w stosie.
Jeśli aktualna funkcja middleware nie zakończy cyklu żądanie-odpowiedź, musi wywołać next()
, aby przekazać kontrolę do następnej funkcji middleware. W przeciwnym razie, żądanie zostanie pozostawione w zawieszeniu.
Aplikacja Express może korzystać z następujących typów oprogramowania pośredniczącego:
- Oprogramowanie pośredniczące na poziomie aplikacji
- Oprogramowanie pośredniczące na poziomie routera
- Oprogramowanie pośredniczące do obsługi błędów
- Wbudowane oprogramowanie pośredniczące
- Oprogramowanie pośredniczące stron trzecich
Możesz załadować oprogramowanie pośredniczące na poziomie aplikacji i routera za pomocą opcjonalnej ścieżki montowania.Można również załadować serię funkcji oprogramowania pośredniczącego razem, co tworzy podstack systemu oprogramowania pośredniczącego w punkcie montowania.
Oprogramowanie pośrednie poziomu aplikacji
Wiąż oprogramowanie pośrednie poziomu aplikacji z instancją obiektu app za pomocą funkcji app.use()
i app.METHOD()
, gdzie METHOD
to metoda HTTP żądania, które obsługuje funkcja middleware (np. GET, PUT lub POST) pisana małymi literami.
Niniejszy przykład przedstawia funkcję oprogramowania pośredniczącego bez ścieżki montowania. Funkcja jest wykonywana za każdym razem, gdy aplikacja otrzymuje żądanie.
var express = require('express')var app = express()app.use(function (req, res, next) { console.log('Time:', Date.now()) next()})
Ten przykład pokazuje funkcję middleware zamontowaną na ścieżce /user/:id
. Funkcja jest wykonywana dla każdego typu żądaniaHTTP na ścieżce /user/:id
.
app.use('/user/:id', function (req, res, next) { console.log('Request Type:', req.method) next()})
Przykład przedstawia trasę i jej funkcję obsługującą (system middleware). Funkcja obsługuje żądania GET do ścieżki /user/:id
path.
app.get('/user/:id', function (req, res, next) { res.send('USER')})
Tutaj znajduje się przykład ładowania serii funkcji middleware w punkcie montowania, ze ścieżką montowania.Ilustruje on podstack middleware, który drukuje informacje o żądaniu dla dowolnego typu żądania HTTP do ścieżki /user/:id
.
app.use('/user/:id', function (req, res, next) { console.log('Request URL:', req.originalUrl) next()}, function (req, res, next) { console.log('Request Type:', req.method) next()})
Podręczyciele tras umożliwiają zdefiniowanie wielu tras dla ścieżki. Poniższy przykład definiuje dwie trasy dla żądań GET do ścieżki /user/:id
. Druga trasa nie spowoduje żadnych problemów, ale nigdy nie zostanie wywołana, ponieważ pierwsza trasa kończy cykl żądanie-odpowiedź.
Ten przykład pokazuje podstack middleware, który obsługuje żądania GET do ścieżki /user/:id
.
app.get('/user/:id', function (req, res, next) { console.log('ID:', req.params.id) next()}, function (req, res, next) { res.send('User Info')})// handler for the /user/:id path, which prints the user IDapp.get('/user/:id', function (req, res, next) { res.send(req.params.id)})
Aby pominąć resztę funkcji oprogramowania pośredniczącego ze stosu oprogramowania pośredniczącego routera, należy wywołać next('route')
, aby przekazać sterowanie do następnej ścieżki.UWAGA: next('route')
będzie działać tylko w funkcjach middleware, które zostały załadowane za pomocą funkcji app.METHOD()
lub router.METHOD()
.
Ten przykład pokazuje podstack middleware, który obsługuje żądania GET do ścieżki /user/:id
.
app.get('/user/:id', function (req, res, next) { // if the user ID is 0, skip to the next route if (req.params.id === '0') next('route') // otherwise pass the control to the next middleware function in this stack else next()}, function (req, res, next) { // send a regular response res.send('regular')})// handler for the /user/:id path, which sends a special responseapp.get('/user/:id', function (req, res, next) { res.send('special')})
Middleware można również zadeklarować w tablicy w celu ponownego użycia.
Ten przykład pokazuje tablicę z podstacią middleware, która obsługuje żądania GET do ścieżki /user/:id
path
function logOriginalUrl (req, res, next) { console.log('Request URL:', req.originalUrl) next()}function logMethod (req, res, next) { console.log('Request Type:', req.method) next()}var logStuff = app.get('/user/:id', logStuff, function (req, res, next) { res.send('User Info')})
Router-level middleware
Router-level middleware działa w taki sam sposób jak application-level middleware, z tą różnicą, że jest związane z instancją express.Router()
.
var router = express.Router()
Wczytaj oprogramowanie pośrednie poziomu routera za pomocą funkcji router.use()
i router.METHOD()
.
Następujący przykładowy kod replikuje system oprogramowania pośredniczącego, który został przedstawiony powyżej dla oprogramowania pośredniczącego na poziomie aplikacji, poprzez użycie oprogramowania pośredniczącego na poziomie routera:
var express = require('express')var app = express()var router = express.Router()// a middleware function with no mount path. This code is executed for every request to the routerrouter.use(function (req, res, next) { console.log('Time:', Date.now()) next()})// a middleware sub-stack shows request info for any type of HTTP request to the /user/:id pathrouter.use('/user/:id', function (req, res, next) { console.log('Request URL:', req.originalUrl) next()}, function (req, res, next) { console.log('Request Type:', req.method) next()})// a middleware sub-stack that handles GET requests to the /user/:id pathrouter.get('/user/:id', function (req, res, next) { // if the user ID is 0, skip to the next router if (req.params.id === '0') next('route') // otherwise pass control to the next middleware function in this stack else next()}, function (req, res, next) { // render a regular page res.render('regular')})// handler for the /user/:id path, which renders a special pagerouter.get('/user/:id', function (req, res, next) { console.log(req.params.id) res.render('special')})// mount the router on the appapp.use('/', router)
Aby pominąć resztę funkcji oprogramowania pośredniczącego routera, należy wywołać next('router')
do przekazania kontroli z powrotem poza instancję routera.
Ten przykład pokazuje podstack middleware, który obsługuje żądania GET do ścieżki /user/:id
.
var express = require('express')var app = express()var router = express.Router()// predicate the router with a check and bail out when neededrouter.use(function (req, res, next) { if (!req.headers) return next('router') next()})router.get('/user/:id', function (req, res) { res.send('hello, user!')})// use the router and 401 anything falling throughapp.use('/admin', router, function (req, res) { res.sendStatus(401)})
Error-handling middleware
Error-handling middleware zawsze przyjmuje cztery argumenty. Musisz podać cztery argumenty, aby zidentyfikować go jako funkcję oprogramowania pośredniczącego obsługującego błędy. Nawet jeśli nie musisz używać obiektu next
, musisz go podać, aby zachować sygnaturę. W przeciwnym razie, obiekt next
będzie interpretowany jako zwykłe middleware i nie będzie obsługiwał błędów.
Zdefiniuj funkcje middleware obsługujące błędy w taki sam sposób, jak inne funkcje middleware, z tym że z czterema argumentami zamiast trzech, a konkretnie z sygnaturą (err, req, res, next)
):
app.use(function (err, req, res, next) { console.error(err.stack) res.status(500).send('Something broke!')})
Szczegóły na temat oprogramowania middleware obsługującego błędy, zobacz: Error handling.
Wbudowane oprogramowanie pośredniczące
Począwszy od wersji 4.x, Express nie zależy już od Connect. Funkcje middleware, które były wcześniej dołączone do Express, znajdują się teraz w oddzielnych modułach; zobacz listę funkcji middleware.
Express ma następujące wbudowane funkcje middleware:
- express.static obsługuje statyczne zasoby, takie jak pliki HTML, obrazy i tak dalej.
- express.json parsuje przychodzące żądania z ładunkiem JSON. UWAGA: Dostępne z Express 4.16.0+
- express.urlencoded parsuje przychodzące żądania z URL-encoded payloads. UWAGA: Dostępne z Express 4.16.0+
Oprogramowanie pośrednie firm trzecich
Użyj oprogramowania pośredniego firm trzecich, aby dodać funkcjonalność do aplikacji Express.
Zainstaluj moduł Node.js dla wymaganej funkcjonalności, a następnie załaduj go do swojej aplikacji na poziomie aplikacji lub na poziomie routera.
Następujący przykład ilustruje instalację i ładowanie funkcji oprogramowania pośredniego przetwarzającej pliki cookie cookie-parser
.
$ npm install cookie-parser
var express = require('express')var app = express()var cookieParser = require('cookie-parser')// load the cookie-parsing middlewareapp.use(cookieParser())
Częściową listę funkcji oprogramowania pośredniego firm trzecich, które są powszechnie używane z Express, można znaleźć w: Third-party middleware.