2014-06-17 4 views
13

Dopo l'aggiornamento a Express 4 e la rimozione di app.router, sto faticando a ottenere il middleware da eseguire dopo l'esecuzione delle route.middleode Node Express 4 dopo le route

ad es. il seguente codice risponde correttamente con "ciao", ma non chiama mai il middleware configurato

var express = require("express")(); 

express.get("/", function(req, res) { 

    res.send("hello"); 

}); 
express.use(function(req, res, next) { 

    console.log("world"); 
    next(); 

}); 

express.listen(8888); 

PRECISAZIONE:

il seguente codice mostra "prima" sulla console, ma non "dopo":

var express = require("express")(); 

express.use(function(req, res, next) { 

    console.log("before"); 
    next(); 

}); 
express.get("/", function(req, res) { 

    res.send("hello"); 

}); 
express.use(function(req, res, next) { 

    console.log("after"); 
    next(); 

}); 

express.listen(8888); 
+0

Funziona per me. Cosa non funziona per te. – user568109

+0

Non vedo mai l'output di console.log – goofballLogic

+0

Mostra per me alla riga di comando node.js. Hai un codice aggiuntivo? – user568109

risposta

14

per quanto riguarda Express 4, il "dopo" funzione dal secondo esempio non viene mai chiamato perché la funzione di mezzo non chiama mai successivo().

Se si desidera che il "dopo" funzione per ottenere chiamata, allora avete bisogno di aggiungere e chiamare il successivo richiamata dalla funzione di mezzo come questo:

var express = require("express")(); 

express.use(function(req, res, next) { 

    console.log("before"); 
    next(); 

}); 
express.get("/", function(req, res, next) { 

    res.send("hello"); 
    next();  // <=== call next for following middleware 

}); 
express.use(function(req, res, next) { 

    console.log("after"); 
    next(); 

}); 

express.listen(8888); 

res.send() scrive le intestazioni e la risposta al client .

Attenzione, una volta che ris.send() è stato chiamato, non si desidera aggiornare le intestazioni oi contenuti della risposta. Ma puoi svolgere altre attività come gli aggiornamenti del database o la registrazione.

Si noti che express analizza il numero di argomenti nella funzione middleware e ha una logica diversa. Prendiamo ad esempio express error handlers, che hanno 4 parametri definiti.

espresso firma gestore di errore: app.use(function(err, req, res, next) {});

chiamata successiva sul ultimo elemento nella catena del middleware è facoltativo, ma probabilmente una buona idea nel caso in cui mai cambiare le cose.

+0

Ora è vero.La maggior parte degli esempi per i percorsi di esposizione rapida viene specificata con un arity di 2 nella funzione di gestione. Ma fare ciò preclude sempre l'aggiunta di middleware che dovrebbe essere eseguito dopo che il percorso è stato gestito. Sembra una strana convenzione da stabilire per loro. – goofballLogic

0

ordine è importante http://expressjs.com/4x/api.html#app.use

express.use(function(req, res, next) { 
    console.log("world"); 
    next(); 
}); 
express.get("/", function(req, res) { 
    res.send("hello"); 
}); 
+0

Sì, ma questo è l'ordine sbagliato. Voglio che il mio middleware venga eseguito dopo il gestore del percorso. – goofballLogic

+0

Hai controllato se funziona già. – user568109

2

avete controllare ed inserendo il tuo console.log dopo la chiamata successiva()?

express.use(function(req, res, next) { 
    next(); 
    console.log("world"); 
}); 
express.get("/", function(req, res) { 
    res.send("hello"); 
}); 
7

La risposta corretta sta utilizzando il callback res.on('finish', cb).

cioè .:

express.use(function(req, res, next) { 
    console.log("before"); 

    res.on('finish', function() { 
     console.log("after); 
    }); 

    next(); 
}); 
-1

Se siete in grado di lavorare con un altro quadro, vi consiglio di utilizzare ZinkyJS, ha un built-in modo di farlo. Controlla qui: ZinkyJS AFTER HOOKS