2015-04-05 6 views
18

Nel Express docs, si dice: livello middlewareQual è la differenza tra middleware di livello dell'applicazione e del router quando si esegue il routing in Express?

applicazione sono tenuti a un'istanza di espresso, utilizzando app.use() e app.VERB().

Il middleware a livello di router funziona come il middleware a livello di applicazione eccetto che sono associati a un'istanza di express.Router(). Il sistema middleware creato a livello di applicazione nell'esempio precedente può essere replicato a livello di router utilizzando il seguente codice.

Nell'applicazione fornita dal generatore Express, vedo nella principale app.js, c'è:

var routes = require('./routes/index'); 
app.use('/', routes); 

E in ./routes/index.js, vedo questo:

var express = require('express'); 
var router = express.Router(); 

/* GET home page. */ 
router.get('/', function(req, res, next) { 
    res.render('index', { title: 'Express' }); 
}); 

module.exports = router; 

Qual è la scopo di app.use passarlo a router.get invece di utilizzare semplicemente app.get? E in generale, qual è la differenza tra app.VERB e router.VERB in termini di routing?

risposta

17

Qual è lo scopo di app.use passarlo a router.get invece di utilizzare semplicemente app.get?

Questo è tutto solo progettando per modularità. Permette di dividere un'applicazione in diversi pezzi più piccoli e senza accoppiamento e poiché non tutti hanno una conoscenza diretta dell'istanza condivisa app che li combina insieme, la modularità è raggiunta.

Ad esempio, è possibile creare un intero sottosistema di account utente che gestisca la registrazione, l'accesso, la password dimenticata, ecc.

Questo è l'unico scopo dietro questo. Non ci sono altrimenti differenze funzionali, tecniche o di rendimento.

E in generale, qual è la differenza tra app.VERB e router.VERB in termini di routing?

Nessuna differenza. L'app ha il proprio router principale/primario e app.VERB è solo zucchero di convenienza per l'equivalente di app.router.VERB.

+0

Così 'express.Router()' e 'app = espresso()' sarà lo stesso oggetto? –

3

Un esempio aiuterà qui:

Negli birds.js:

// birds.js 

var express = require('express'); 
var router = express.Router(); 

// middleware that is specific to this router 
router.use(function timeLog(req, res, next) { 
    console.log('Time: ', Date.now()); 
    next(); 
}); 
// define the home page route 
router.get('/', function (req, res) { 
    res.send('Birds home page'); 
}); 

Negli app.js:

// app.js 

var birds = require('./birds'); 
app.use('/birds', birds); 

Ora le richieste al http://localhost:3000/birds/ andrà a birds.js file.

Questo approccio modulare semplifica la gestione di una base di codice di grandi dimensioni, in quanto l'applicazione diventa grande.

Fonte: https://expressjs.com/en/guide/routing.html

Problemi correlati