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

发布于 2022-09-12 13:14:52 字数 3852 浏览 12 评论 0

背景

使用中间件路由重定向

问题

在中间件中使用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中间件是否对以上的逻辑有影响?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

黑色毁心梦 2022-09-19 13:14:52

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文