为什么Express重定向无限地重定向我?

时间:2019-11-20 12:50:10

标签: javascript node.js express

我正在尝试使用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;

3 个答案:

答案 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处理'/'路由