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中间件是否对以上的逻辑有影响?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
有个很大的问题,
app.use(redirectFn(router))
和app.use(redirectFn(app))
用法不对,redirectFn 里面有注册路由,每次访问,redirectFn里的注册逻辑每次都执行一次两种写法不一致,很可能和 middlewre 注册顺序有关