Промежуточное ПО Node Express 4 после маршрутов
После обновления до Express 4 и удаления app.router я изо всех сил пытаюсь заставить промежуточное программное обеспечение выполняться после выполнения маршрутов.
например, следующий код правильно отвечает "привет", но никогда не вызывает настроенное промежуточное ПО
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 );
ПОЯСНЕНИЯ:
следующий код показывает "до" на консоли, но не "после":
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 );
7 ответов
Что касается Express 4, функция after после вашего второго примера никогда не вызывается, потому что средняя функция никогда не вызывает next().
Если вы хотите, чтобы вызывалась функция after, вам нужно добавить и вызвать следующий обратный вызов из вашей средней функции следующим образом:
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()
записывает заголовки и ответ обратно клиенту.
Помните, что после вызова res.send() вы не захотите обновлять заголовки или содержимое вашего ответа. Но вы можете выполнять другие задачи, такие как обновление базы данных или ведение журнала.
Обратите внимание, что express просматривает количество аргументов в функции промежуточного программного обеспечения и выполняет другую логику. Возьмем, к примеру, экспресс-обработчики ошибок, для которых определены 4 параметра.
экспресс-подпись обработчика ошибок: app.use(function(err, req, res, next) {});
Позвонить по последнему пункту в вашей цепочке промежуточного программного обеспечения необязательно, но, вероятно, это хорошая идея, если вы когда-нибудь что-то измените.
Правильный ответ использует res.on("finish", cb)
Перезвоните.
то есть:
express.use(function(req, res, next) {
console.log("before");
res.on("finish", function() {
console.log("after");
});
next();
});
Вы проверили размещение вашего console.log после вызова next()?
express.use( function( req, res, next ) {
next();
console.log( "world" );
});
express.get( "/", function( req, res ) {
res.send( "hello" );
});
const beforeMiddleware = function(req, res, next) {
console.log('Before middleware triggered');
next();
}
const responseHandler = function(req, res, next) {
console.log('Response handler');
res.status(200).send("Hello world");
next();
}
const afterMiddleware = function(req, res, next) {
console.log('After middleware triggered');
next();
}
app.get('/', beforeMiddleware, handler, afterMiddleware);
Вы можете использовать функцию Middle ware в другом файле js, и вы можете использовать функцию require. так что он будет вызываться до и после HTTP-запроса.
index.js:
const logger = require("./logger");
const express = require("express");
var app = express();
app.listen("3000",()=>console.log("listening on 3000..."))
app.use(logger("AppServer"));
//get expression
app.get("/", function(req,res){
console.log("res not received");
res.send("Hello World");
console.log("res received");
})
logger.js
module.exports = (applicationName) =>{
return function log(req,res,next){
console.log(applicationName+" started "+os.hostname);
res.on("finish",()=>{
console.log(applicationName+" completed "+os.hostname);
})
next();
}};
output:
AppServer started hostname-PC
res not received
res received
AppServer completed hostname-PC
Примечание: в logger.js вместо использования res.on("finish",callback) вы можете использовать req.on("end",callback)
Если вы можете работать с другим фреймворком, я предлагаю вам использовать ZinkyJS, у него есть встроенный способ сделать это. Проверьте здесь: ZinkyJS ПОСЛЕ КРЮЧКОВ
Порядок важен http://expressjs.com/4x/api.html
express.use( function( req, res, next ) {
console.log( "world" );
next();
});
express.get( "/", function( req, res ) {
res.send( "hello" );
});