2015-02-03 30 views
137

Sto iniziando con NodeJS e Express 4, e sono un po 'confuso. Ho letto il sito web express, ma non riesco a vedere _quando utilizzare un gestore di percorsi o quando utilizzare express.Router.Differenze tra express.Router e app.get?

Come ho potuto vedere, se voglio mostrare una pagina o qualcosa quando l'utente preme /show per esempio dovrei usare:

var express = require('express')  
var app = express()  
app.get("/show", someFunction) 

All'inizio, ho pensato che questo era vecchio, per express3, è giusto o questo è il modo anche per express4?

Se questo è il modo di farlo in express4, ciò che è express.Router utilizzato per?

ho letto quasi lo stesso esempio come sopra, ma utilizzando express.Router:

var express = require('express'); 
var router = express.Router(); 
router.get("/show", someFunction) 

Quindi, qual è la differenza tra i due esempi?

Quale dovrei usare se voglio solo fare un semplice sito di test?

+6

Un 'Router' non' .listen() 'per richieste per conto proprio. È utile per separare la tua applicazione in più moduli - creando un 'Router' in ognuno che l'' app' può 'require()' e '.use()' come middleware. –

+2

Come suggerito da @JonathanLonowski, la sintassi 'app.get (..)' è solo una scorciatoia per rendere più conveniente lavorare con 'express.router'. Se sei appena agli inizi, non preoccuparti delle specifiche del router. – soulprovidr

+0

quindi stai dicendo che dovrei usare solo per il momento app.get()? ancora confuso su quando usare uno o l'altro – nelson687

risposta

169

app.js

var express = require('express'), 
    dogs = require('./routes/dogs'), 
    cats = require('./routes/cats'), 
    birds = require('./routes/birds'); 

var app = express(); 

app.use('/dogs', dogs); 
app.use('/cats', cats); 
app.use('/birds', birds); 

app.listen(3000); 

dogs.js

var express = require('express'); 

var router = express.Router(); 

router.get('/', function(req, res) { 
    res.send('GET handler for /dogs route.'); 
}); 

router.post('/', function(req, res) { 
    res.send('POST handler for /dogs route.'); 
}); 

module.exports = router; 

Quando express() viene chiamato in app.js, un oggetto applicazione viene restituito. Pensa a un oggetto app come un'applicazione Express.

Quando viene chiamato express.Router(), viene restituita una "mini app" leggermente diversa. L'idea alla base della "mini app" è che i diversi percorsi nella tua app possono diventare piuttosto complicati e trarrai vantaggio dal trasferire quella logica in un file separato.

In questo semplice esempio sopra, la logica per i /cani percorso è stato spostato in un proprio file solo così i suoi gestori GET e POST non ingombrare app.js. Ora puoi lavorare sulla logica per qualsiasi richiesta a /cani in isolamento e non preoccuparti di come interesserà /gatti e /uccelli.

Se si dispone di una logica (denominata middleware in Express) che riguarda tutti e tre i percorsi, è possibile inserirla in app.js sopra le chiamate app.use(...). Se hai una logica che riguarda solo uno di quei percorsi (/cani), lo metti nel file solo per quella rotta.

+0

non dovresti passare l'oggetto app su 'app.usa ('/ cani', cani) (app) 'dal momento che stai definendo percorsi lì, in aggiunta (e correggimi se ho torto) se lo fai in questo modo l'oggetto app ha tutto il middleware precedentemente posizionato su di esso verranno aggiunti ulteriori oggetti middle all'oggetto app (supponendo che più middle-ware si trovi nella rotta dogs). se usi 'route.get ('/ dogs', route)' passa solo la middleware all'oggetto app quando interagisce con le rotte definite in quel router e se l'ambito dell'app è fuori rotta non lo fa avere accesso a quel middleware. – Ravenous

+0

Non è necessario passare l'app al percorso, perché il percorso viene passato all'app con 'app.use ('/ dogs', show)'. In questo modo il percorso è indipendente dall'app e può essere riutilizzato in qualsiasi app Express. Middleware posizionato ovunque prima che un percorso venga utilizzato da quella rotta. Se metti il ​​middleware sopra tutti i percorsi in app.js, tutti i percorsi useranno quel middleware. Se si posiziona il middleware all'interno di un file di percorso (dogs.js), solo tale percorso lo utilizzerà. Se si posiziona il middleware dopo il percorso GET all'interno di dogs.js, solo il percorso POST lo utilizzerà (finché termina con una risposta). – Nocturno

+0

Ah mio male. Intendevo inserire 'app.get ('/ dogs'dogs,) (app)' dato che la domanda riguardava la funzione get di app.get e route.get. stavi mostrando come separare i percorsi per renderli gestibili. Ma il mio aneddoto non sarebbe corretto se parliamo di 'app.get'? Se riesco a salire su un PC, modifico il mio commento sopra. – Ravenous

15

Express 4.0 viene fornito con il nuovo router. Come menzionato nel sito:

La classe express.Router può essere utilizzato per creare percorso montabile modulare gestori. Un'istanza del router è un sistema completo middleware e routing ; per questo motivo viene spesso definito "mini-app".

C'è un buon articolo a https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4 che descrive le differenze e cosa si può fare con i router.

Per summerize

Con router si può modulare il codice più semplice, è possibile utilizzare i router come:

  1. Itinerari di base: casa, Chi
  2. percorso Middleware per registrare le richieste a la console
  3. percorso con parametri
  4. percorso Middleware per I parametri per validare i parametri specifici
  5. convalida un parametro passato a un determinato percorso

Avviso:

L'oggetto app.router, che è stato rimosso in veloce 4, ha fatto una rimonta in veloce 5. In la nuova versione, è solo un riferimento al router Express di base, a differenza di Express 3, in cui un'applicazione ha dovuto caricarlo esplicitamente.

0
app.route('/book') 
    .get(function (req, res) { 
    res.send('Get a random book') 
    }) 
    .post(function (req, res) { 
    res.send('Post a random book') 
    }) 

Come nell'esempio precedente, possiamo aggiungere un metodo di richiesta HTTP diverso sotto una rotta.

1

utilizzando app.js per scrivere percorsi significa che sono accessibili a tutti gli utenti come app.js viene caricato all'avvio dell'applicazione. Tuttavia, la collocazione dei percorsi nelle mini app express.router() protegge e limita la loro accessibilità.

0

In una parola, express.Router può fare più cose quando paragona a app.get(), come ad esempio il middleware, inoltre, è possibile definire più un oggetto router con express.Router()