当我在中间件中重写url时,express将转到下一个第一个中间件,但即使该中间件匹配模式路径也不会转到下一个中​​间件。下面的示例代码。当我浏览http://localhost:3000时,控制台日志消息


  中间件1
  
  中间件2


这样就不会跳到中间件3

const express = require('express')
const app = express()

app.get('/',function (req, res, next) {
 // i want to rewrite url to http://localhost:3000/next but not redirect page
 req.url = req.protocol + '://' + req.get('host') + req.originalUrl + 'nxt'
 console.log('middleware1');
 next()
})

app.use('/nxt',function (req, res, next) {
 console.log('middleware2');
 next()
})

app.use('/nxt',function (req, res, next) {
 console.log('middleware3');
 next()
})

app.listen(3000);


但是当我浏览URL http://localhost:3000/nxt时,控制台日志消息


  中间件2
  
  中间件3


这样就跳到了中间件3

或者,如果我通过“ app.get”或“ app.all”更改“ app.use”,当我浏览URL http://localhost:3000时,它仍会跳转到中间件3

请为我解释为什么?那是个错误吗?谢谢!

最佳答案

您可以简单地做-

app.get('/',function (req, res, next) {
    console.log('middleware 1');
    req.path = req.url = '/next';
    next();
});

app.use('/next',function (req, res, next) {
    console.log('middleware2');
    next()
});

app.use('/next',function (req, res, next) {
    console.log('middleware3');
    next();
});


它将打印。

middleware1
middleware2
middleware3

08-07 15:32