express在中间件中使用app.get和route.get进行重定向的区别?

背景

使用中间件路由重定向

问题

在中间件中使用app.get('/', function(req,res){
res.redirect('/comic/index');
})和
app.get('/comic', function(req, res) => {
res.redirect('/comic/index');
}),重定向代码逻辑不会被执行

//中间件代码
module.exports = function redirectWm(app) {
   return function (req, res, next) {
       const path = req.path;
       // 重定向
       app.get('/', (req, res) => {
           // 不会被执行
           res.redirect('/comic/index');
       });
       app.get('/comic', (req, res) => {
           // 不会被执行
           res.redirect('/comic/index');
       });
       app.get('/ulink/comic', (req, res) => {
           // 可以正常执行
           res.redirect('/comic/ulink');
       });
       // 纯漫重定向
       if (path.indexOf('pure-comic') > -1) {
           res.redirect(path.replace('pure-comic', 'comic'));
       }
       next();
   }
}
// index.js
const express = require('express');
const history = require('connect-history-api-fallback');
const redirectFn = require('./middlewares/redirect');
const app = express();
module.exports = app;
app.use(redirectFn(app));
// 感觉像是connect-history-api-fallback影响了app.get的逻辑
app.use(history(
   {
       rewrites: [
           {//后缀为js|css 访问comic下相应文件
               from: /^\/.*\.(js|css|jpg|png|gif|ico|json|pdf|txt|mp3|mp4)$/,
               to: function(context) {
                   return context.parsedUrl.pathname;
               }
           },
           {//访问路径含comic则继续访问/comic/index.html
               from: /(^\/comic\/.*$)|(^\/$)/,
               to: function(context) {
                   return '/comic/index.html';
               }
           },
           {//访问路径不含comic则默认访问
               from: /^\/.*$/,
               to: function(context) {
                   return context.parsedUrl.pathname;
               }
           },
       ]
   }
));

在中间件中使用router.get('/', function(req,res){
res.redirect('/comic/index');
})和
router.get('/comic', function(req, res) => {
res.redirect('/comic/index');
}),重定向代码逻辑可以正常执行

// 中间件代码
module.exports = function redirectWm(router) {
   return function (req, res, next) {
       const path = req.path;
       // 重定向
       router.get('/', (req, res) => {
           res.redirect('/comic/index');
       });
       router.get('/comic', (req, res) => {

           res.redirect('/comic/index');
       });
       router.get('/ulink/comic', (req, res) => {
           res.redirect('/comic/ulink');
       });
       // 纯漫重定向
       if (path.indexOf('pure-comic') > -1) {
           res.redirect(path.replace('pure-comic', 'comic'));
       }
       next();
   }
}
// index.js
// index.js
const express = require('express');
const history = require('connect-history-api-fallback');
const redirectFn = require('./middlewares/redirect');
const app = express();
const router = express.Router();

module.exports = app;
app.use('/', router);
app.use(redirectFn(router));

app.use(history(
   {
       rewrites: [
           {//后缀为js|css 访问comic下相应文件
               from: /^\/.*\.(js|css|jpg|png|gif|ico|json|pdf|txt|mp3|mp4)$/,
               to: function(context) {
                   return context.parsedUrl.pathname;
               }
           },
           {//访问路径含comic则继续访问/comic/index.html
               from: /(^\/comic\/.*$)|(^\/$)/,
               to: function(context) {
                   return '/comic/index.html';
               }
           },
           {//访问路径不含comic则默认访问
               from: /^\/.*$/,
               to: function(context) {
                   return context.parsedUrl.pathname;
               }
           },
       ]
   }
));

而如果直接在index.js中执行app.get('/',callback),也是能正常执行回调逻辑的,所以不太清楚在中间件中app和router有什么区别导致了上述的差异,connect-history-api-fallback中间件是否对以上的逻辑有影响?

阅读 1.8k
1 个回答

有个很大的问题,app.use(redirectFn(router))app.use(redirectFn(app)) 用法不对,redirectFn 里面有注册路由,每次访问,redirectFn里的注册逻辑每次都执行一次

两种写法不一致,很可能和 middlewre 注册顺序有关

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进