2013-07-19 18 views
12

Questa domanda si estende quella di What is Node.js' Connect, Express and "middleware"?Middleware modello di progettazione in Node.js: Collegare

sto andando il percorso di apprendimento Javascript -> Node.js -> Connessione -> Express -> ... al fine di scopri come utilizzare un moderno stack di sviluppo web. Ho un background in networking a basso livello, quindi andare su e andare con i moduli di Node.js 'net e http è stato facile. Lo schema generale di utilizzo di un server per indirizzare le richieste a diversi gestori sembrava naturale e intuitivo.

Passando a Connetti, temo di non capire il paradigma e il flusso generale di dati di questo "middleware". Ad esempio, se creo del middleware da utilizzare con Connect ala;

// example.js  
module.exports = function (opts) { 
    // ... 
    return function(req, res, next) { 
     // ... 
     next(); 
    }; 
}; 

e "uso" in Connect via

var example = require('./example'); 
// ... 
var server = connect.createServer(); 
// ... 
server.use(example(some_paramater)); 

Non so quando il mio middleware viene chiamato. Inoltre, se sono use() di altri middlware, posso essere garantito nell'ordine in cui viene chiamato il middleware? Inoltre, sono convinto che la funzione next() sia utilizzata per chiamare il middleware successivo a (ancora, come posso stabilire un ordine?); tuttavia, non vengono passati parametri (req, res, next). Questi parametri sono passati implicitamente in qualche modo?

Sto indovinando che la raccolta di moduli di middleware utilizzati sono legati insieme, a cominciare dal http callback -> quindi un gruppo di funzionalità aggiuntive nel mezzo della richiesta di richiamata iniziale e il server di terminare una risposta .

Sto cercando di capire il paradigma del middleware e il flusso di informazioni/esecuzione.

Qualsiasi aiuto è molto apprezzato. Grazie per aver letto

risposta

11

Il middleware è chiamato come una catena di funzioni, con ordine basato sull'ordine di definizione del middleware (tempo) con percorsi corrispondenti (se applicabile).
Tenendo conto che gli oggetti req e res viaggiano attraverso la catena in modo da poter riutilizzare/migliorare/modificare i dati in essi lungo la catena.

ci sono due casi d'uso generale per il middleware: generica e specifica.

Generico è come è stato definito nell'esempio sopra: app.use, si applicherà a ogni singola richiesta. Ogni middleware deve chiamare next() all'interno, se vuole procedere al prossimo middleware.

Quando si utilizza app.get('/path', function(... questa funzione effettiva è anche il middleware, solo definito in linea. Quindi è completamente basato su middleware e non è disponibile endware: D

L'ordine di catena si basa sull'ordine di definizione. Quindi è importante definire il middleware in modo sincronizzato o in modo asincrono affidabile. Altrimenti, un diverso ordine di middleware può rompere la logica, quando la catena del middleware dipende l'una dall'altra.

Alcuni middleware possono essere utilizzati per rompere la catena return next(new Error());.È utile ad esempio per la convalida o il middleware di autenticazione.
Un altro utile schema di utilizzo per il middleware è l'elaborazione e l'analisi dei dati di richiesta, come i cookie, o un buon esempio di tale app.use(express.bodyParser());.

+0

Quindi se avessi 'var A = require ('./ A'), B = require ('./ B'); app.use (A()); app.use (B()); 'quindi' A' verrebbe prima di 'B', con' A' 'next' che invoca' B'? I parametri sono quindi passati implicitamente? Altrimenti come 'B' accederà a' req, res, ect'? – gone

+0

Esattamente. Gli oggetti 'req' e' res' stanno attraversando ed è lo stesso oggetto in tutta la catena. In questo modo è possibile salvare alcuni dati al suo interno e quindi riutilizzarli in un altro middleware lungo la catena. Questo è esattamente ciò che accade con la maggior parte dei tuoi dati in 'req'. Ad esempio, per impostazione predefinita, i dati del corpo POST non vengono analizzati e il middleware 'express.bodyParser()' lo analizzerà, e sarà possibile accedervi successivamente in catena. – moka

+0

Fantastico! Grazie per la risposta! – gone

Problemi correlati