路由后的Node Express 4中间件

时间:2014-06-17 08:09:52

标签: node.js express middleware express-4

升级到Express 4并删除app.router后,我很难在路由执行后让中间件执行。

e.g。以下代码正确响应" 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 );

5 个答案:

答案 0 :(得分:38)

正确答案是使用res.on("finish", cb)回调。

即:

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

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

    next();
});

答案 1 :(得分:22)

关于Express 4,""""你的第二个例子中的函数永远不会被调用,因为中间函数从不调用next()。

如果你想要"之后"函数被调用,然后你需要添加并调用中间函数的下一个回调,如下所示:

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会查看中间件函数中的参数数量,并执行不同的逻辑。以express error handlers为例,其中定义了4个参数。

表达错误处理程序签名:app.use(function(err, req, res, next) {});

在中间件链的最后一个项目上调用next是可选的,但如果你改变了一些东西,这可能是一个好主意。

答案 2 :(得分:3)

您是否检查过next()之后调用console.log?

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

答案 3 :(得分:0)

订单很重要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" );
});

答案 4 :(得分:0)

您可以在其他js文件中使用Middle ware函数,并且可以使用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中,您可以使用req.on(“ end”,callback)代替使用res.on(“ finish”,callback)