web-dev-qa-db-ja.com

Nodeルート後のExpress 4ミドルウェア

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 );
29
goofballLogic

正解はres.on("finish", cb)コールバックを使用することです。

すなわち:

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

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

    next();
});
46
Test

Next()呼び出しの後にconsole.logを置くことを確認しましたか?

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

順序は重要です 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
vinayr

異なる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)を使用できます。

0
Loganathan .R