Express è un framework web di routing e middleware che ha funzionalità minime proprie: Un’applicazione Express è essenzialmente una serie di chiamate a funzioni middleware.
Le funzioni middleware sono funzioni che hanno accesso all’oggetto richiesta (req
), all’oggetto risposta (res
), e alla prossima funzione middleware nel ciclo richiesta-risposta dell’applicazione. La prossima funzione middleware è comunemente indicata da una variabile chiamata next
.
Le funzioni middleware possono eseguire i seguenti compiti:
- Eseguire qualsiasi codice.
- Apportare modifiche alla richiesta e agli oggetti risposta.
- Finire il ciclo richiesta-risposta.
- Chiamare la prossima funzione middleware nello stack.
Se la funzione middleware corrente non termina il ciclo richiesta-risposta, deve chiamare next()
per passare il controllo alla prossima funzione middleware. Altrimenti, la richiesta rimarrà sospesa.
Un’applicazione Express può usare i seguenti tipi di middleware:
- Mediaware a livello di applicazione
- Mediaware a livello di router
- Mediaware per la gestione degli errori
- Mediaware incorporato
- Mediaware di terze parti
È possibile caricare middleware a livello di applicazione e di router con un percorso di montaggio opzionale.Si può anche caricare una serie di funzioni middleware insieme, il che crea un sub-stack del sistema middleware in un punto di montaggio.
Middleware a livello di applicazione
Legare il middleware a livello di applicazione a un’istanza dell’oggetto app usando le funzioni app.use()
e app.METHOD()
, dove METHOD
è il metodo HTTP della richiesta che la funzione middleware gestisce (come GET, PUT o POST) in minuscolo.
Questo esempio mostra una funzione middleware senza percorso di montaggio. La funzione viene eseguita ogni volta che l’app riceve una richiesta.
var express = require('express')var app = express()app.use(function (req, res, next) { console.log('Time:', Date.now()) next()})
Questo esempio mostra una funzione middleware montata sul percorso /user/:id
. La funzione viene eseguita per qualsiasi tipo di richiestaHTTP sul /user/:id
percorso.
app.use('/user/:id', function (req, res, next) { console.log('Request Type:', req.method) next()})
Questo esempio mostra una rotta e la sua funzione gestore (sistema middleware). La funzione gestisce le richieste GET al /user/:id
percorso.
app.get('/user/:id', function (req, res, next) { res.send('USER')})
Ecco un esempio di caricamento di una serie di funzioni middleware in un punto di montaggio, con un percorso di montaggio.Illustra un sub-stack middleware che stampa le informazioni di richiesta per qualsiasi tipo di richiesta HTTP al /user/:id
percorso.
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()})
I gestori di rotte permettono di definire più rotte per un percorso. L’esempio seguente definisce due rotte per le richieste GET al percorso /user/:id
. La seconda rotta non causerà alcun problema, ma non verrà mai chiamata perché la prima rotta termina il ciclo richiesta-risposta.
Questo esempio mostra un middleware sub-stack che gestisce le richieste GET al percorso /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)})
Per saltare il resto delle funzioni middleware di uno stack middleware router, chiamare next('route')
per passare il controllo al percorso successivo.NOTA: next('route')
funzionerà solo nelle funzioni middleware che sono state caricate usando le funzioni app.METHOD()
o router.METHOD()
.
Questo esempio mostra un middleware sub-stack che gestisce le richieste GET al /user/:id
percorso.
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')})
Il middleware può anche essere dichiarato in un array per la riusabilità.
Questo esempio mostra un array con un middleware sub-stack che gestisce le richieste GET al /user/:id
percorso
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')})
Middleware a livello di router
Il middleware a livello di router funziona come il middleware a livello di applicazione, tranne che è legato ad un’istanza di express.Router()
.
var router = express.Router()
Carica il middleware a livello di router utilizzando le funzioni router.use()
e router.METHOD()
.
Il seguente codice di esempio replica il sistema middleware mostrato sopra per il middleware a livello di applicazione, utilizzando il middleware a livello di router:
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)
Per saltare il resto delle funzioni middleware del router, chiamare next('router')
per passare il controllo fuori dall’istanza del router.
Questo esempio mostra un middleware sub-stack che gestisce le richieste GET al /user/:id
percorso.
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)})
Medioware di gestione degli errori
Il middleware di gestione degli errori prende sempre quattro argomenti. Dovete fornire quattro argomenti per identificarla come una funzione middleware di gestione degli errori. Anche se non è necessario usare l’oggetto next
, è necessario specificarlo per mantenere la firma. Altrimenti, l’oggetto next
sarà interpretato come un normale middleware e non riuscirà a gestire gli errori.
Definire le funzioni middleware di gestione degli errori allo stesso modo delle altre funzioni middleware, tranne che con quattro argomenti invece di tre, in particolare con la firma (err, req, res, next)
):
app.use(function (err, req, res, next) { console.error(err.stack) res.status(500).send('Something broke!')})
Per i dettagli sul middleware di gestione degli errori, vedere: Gestione degli errori.
Built-in middleware
A partire dalla versione 4.x, Express non dipende più da Connect. Le funzioni middleware che erano precedentemente incluse in Express sono ora in moduli separati; vedi la lista delle funzioni middleware.
Express ha le seguenti funzioni middleware incorporate:
- express.static serve risorse statiche come file HTML, immagini e così via.
- express.json analizza le richieste in arrivo con payload JSON. NOTA: disponibile con Express 4.16.0+
- express.urlencoded analizza le richieste in arrivo con payloads codificati in URL. NOTA: Disponibile con Express 4.16.0+
Third-party middleware
Utilizza middleware di terze parti per aggiungere funzionalità alle app Express.
Installa il modulo Node.js per la funzionalità richiesta, quindi caricalo nella tua app a livello di applicazione o a livello di router.
L’esempio seguente illustra l’installazione e il caricamento della funzione middleware di cookie-parsing 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())
Per un elenco parziale delle funzioni middleware di terze parti che sono comunemente usate con Express, vedere: Middleware di terze parti.