Express 4へのアップグレードとapp.routerの削除に続いて、ルートの実行後にミドルウェアを実行するのに苦労しています。
例えば次のコードは「hello」で正しく応答しますが、構成されたミドルウェアを呼び出すことはありません
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 );
正解はres.on("finish", cb)
コールバックを使用することです。
すなわち:
express.use(function(req, res, next) {
console.log("before");
res.on("finish", function() {
console.log("after");
});
next();
});
Next()呼び出しの後にconsole.logを置くことを確認しましたか?
express.use( function( req, res, next ) {
next();
console.log( "world" );
});
express.get( "/", function( req, res ) {
res.send( "hello" );
});
順序は重要です 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" );
});
異なる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)を使用できます。