更新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路由器文档和每个博客和示例中,我发现它说它应该如何工作所以我真的不知所措。
谢谢。
答案 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);
现在一切正常。