Node.js 路由后的Node Express 4中间件

Node.js 路由后的Node Express 4中间件,node.js,express,middleware,express-4,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

在升级到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 );
澄清:

以下代码在控制台上显示“before”,但不显示“after”:

秩序很重要


是否检查了在下一次()调用后放置console.log


对于express4,第二个示例中的“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 );
var express=require(“express”)();
express.use(函数(req、res、next){
控制台日志(“之前”);
next();
} );
express.get(“/”,函数(req,res,next){
res.send(“你好”);

next();//正确答案是使用
res.on(“finish”,cb)
回调

i、 e:


您可以在不同的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)

是的,但这是错误的顺序。我希望我的中间件在路由处理程序之后执行。对我有效。什么对你无效。我从未在node.js命令行上看到console.log outputShows。你有其他代码吗?没有。你运行的是什么版本的express?(我在4.4上)我的是4.4.3。试试看。这是真的。大多数express show routes的示例都是在处理函数中用2的算术数指定的。但是这样做会阻止添加中间件,而中间件应该在处理完路由后执行。这对他们来说似乎是一个奇怪的约定。我可以确认这根本不起作用reth这家伙说的是“res.once”,而不是“res.on”@datdinhqooc。其实这并不重要,因为响应对象的Express完成后,
res
将不可用,因为每个请求都会导致创建一个新的
req
&
res
对(通过Express)。您是对的,通常是负责任的开发人员应该做的,但在这种特殊情况下,它们是相同的。@Catfish这使用了node的
http
module
response
功能。正如您在中所看到的,express的“res对象是node自己的response对象的增强版本,支持所有内置字段和方法。”此方法适用于在所有路由中都没有使用
next
的情况下创建API的情况。它看起来像一个健壮的变体。如果请求执行任何异步操作,则此方法将无法正常工作
express.use( function( req, res, next ) {
  next();
  console.log( "world" );
});
express.get( "/", function( req, res ) {
  res.send( "hello" );
});
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 );
express.use(function(req, res, next) {
    console.log("before");

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

    next();
});
    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