ExpressJS路由器不处理根路由

时间:2017-03-16 14:54:55

标签: node.js express

更新2 :我刚注意到,如果在应用文件中我更改了该行:

app.use('/', home);

为:

app.use('/anything', home);

然后所有子路线"根"工作得很好。

更新3:我刚刚意识到其他事情。 home.js文件中的一个方法,我原来没有包含在下面,因为我认为没有相关性,这是问题的原因。

router.get('/:adventureId', (req, res) => {
   var data;
   //Irrelevant content that sets data as a JSON object.
   res.json(data);
});

结果证明每一个子路由" root"正在这里经过,因为在其他路线上冒险冒险是未定义的,那么数据只是一个空的JSON对象。

所以真正的问题是:如果这个路由器绑定到" /"和其他"根源"必然会有" /冒险"和" / test"为什么他们都经历了" /:adventrueId"?

我有一个非常简单的ExpressJS应用程序,所有的" root"在home之外的每一条路线中都没有被处理,它们总是在页面上显示一个空的JSON对象。

在一些帖子中有人提到它可能是一个缓存问题,因为这些路线总是返回304状态,但我已经尝试过做一个"空缓存和硬重载"在Chrome上,即使是200状态,我仍然会看到一个空白页面,上面显示一个空的JSON对象。我尝试使用MS Edge并获得完全相同的行为。

以下是我所拥有的:

在我的应用文件

var app = express();

var home = require('./routes/home');
var adventure = require('./routes/adventure');
var test = require('./routes/test');

app.use('/', home);
app.use('/adventure', adventure);
app.use('/test', test);

在home.js文件中:

var express = require('express');
var router = express.Router();

router.get('/', (req, res) => {
   console.log("This works fine with http://localhost:3000.");
   res.render('home');
});

router.get('/:adventureId', (req, res) => {
   var data;
   //Irrelevant content that sets data as a JSON object.
   res.json(data);
});

module.exports = router;

在adventure.js文件中:

var express = require('express');
var router = express.Router();

router.use('/:id', (req, res) => {
   console.log("This works fine with http://localhost:3000/adventure/5.");   
   next();
});

router.get('/:id', (req, res) => {
   console.log("This works fine with http://localhost:3000/adventure/5."); 
   res.render('adventure');
});

//I've also tried putting this before the other routes and the result is the same.
router.get('/', (req, res) => {
   console.log("This is never written in the console with http://localhost:3000/adventure.");
   res.send("This is never rendered in the page.");
});

在test.js文件中:

var express = require('express');
var router = express.Router();

router.use('/', (req, res) => {
    console.log("This is never written on the console with http://localhost:3000/test.");
    res.send("Hello from the test root route");
});

module.exports = router;

在ExpressJS路由器文档和每个博客和示例中,我发现它说它应该如何工作所以我真的不知所措。

谢谢。

2 个答案:

答案 0 :(得分:2)

  

如果此路由器绑定到“/”而其他“根”绑定到“/ adventure”和“/ test”,为什么所有这些都经过“/:adventrueId”?

因为Express与基于哪个匹配最佳的路由不匹配,所以匹配哪个匹配首先

在您的情况下,路线/:advertureId已在/adventure/test的路线之前声明。 /adventure/test都匹配/:advertureId,因此调用该路由的处理程序。

如果您想阻止这种情况,请先声明更具体的路线:

app.use('/adventure', adventure);
app.use('/test', test);
app.use('/', home);

答案 1 :(得分:0)

经过多次回顾,对问题进行了多次更新,并且对着键盘敲击我的脑袋终于明白了问题所在:

让路由器设置如下:

app.use('/', home);
app.use('/adventure', adventure);
app.use('/game', gameService);
app.use('/test', test);

和" home"具有此方法签名的路由器:

router.get('/:adventureId', (req, res) => {
   var data;
   //Irrelevant content that sets data as a JSON object.
   res.json(data);
});

每一个子路线" root"被解释为前一个方法的参数所以:

  

/冒险
  /测试
  /任何

将被视为:

  

adventrueId = adventrue
  adventureId =测试
  adventrueId =任何

解决方案是这样做:

app.use('/adventure', adventure);
app.use('/game', gameService);
app.use('/test', test);
app.use('/', home);

现在一切正常。