我正在尝试使用Express和NodeJ建立一个多语言网站。我的问题是我被重定向了100次,而浏览器却给我一个错误,该网页无法正常工作,因为它重定向了我太多次。
app.js
app.use('/', (req,res,next) => {
res.redirect('/en-US');
next();
});
app.use('/:lang', indexRouter);
app.use('/:lang/users', usersRouter);
index.js(indexRouter)
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index');
});
module.exports = router;
答案 0 :(得分:1)
问题在于此路由处理程序:
app.use('/', (req,res,next) => {
res.redirect('/en-US');
next();
});
不仅会受到/
的伤害,还会受到/en-US
的伤害。 app.use()
与该路径等于其请求路径或该路径的子集的任何路由处理程序匹配。因此,浏览器请求“ /”,您重定向到“ / en-US”,然后重定向到“ / en-US”,依此类推,这是一个无限循环。
我不知道您网站的整体URL设计是什么才是最好的整体解决方案。您可以通过将app.use()
更改为app.get()
来防止无限重定向循环:
app.get('/', (req,res,next) => {
res.redirect('/en-US');
});
但是,这将使重定向仅适用于可能正常的GET请求。如果要重定向所有HTTP动词,则可以更改为app.all()
:
app.all('/', (req,res,next) => {
res.redirect('/en-US');
});
这里要了解的重要一点是app.get()
,app.post()
,app.all()
等...都需要与URL路径完全匹配,而app.use()
仅需要子集匹配。这是Express设计中鲜为人知的方面。
此外,在执行next()
后,请删除对res.redirect()
的呼叫。到那时,您已经发送了响应,您不希望任何其他请求处理程序看到该请求。路由完成。
答案 1 :(得分:0)
在您的app.js下
尝试使用
app.use('/',路由器)
答案 2 :(得分:0)
您如何尝试直接通过app.js而不是通过index.js处理'/'路由