gpt4 book ai didi

node.js - ExpressJS Router 不处理根路由

转载 作者:太空宇宙 更新时间:2023-11-03 23:27:01 25 4
gpt4 key购买 nike

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

app.use('/', home);

至:

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

然后所有子路由“roots”都工作正常。

更新 3:我刚刚意识到了一些其他事情。我最初没有在下面包含 home.js 文件中的一个方法,因为我认为不相关,但结果却是问题的原因。

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

事实证明,每条子路线“root”都经过这里,并且由于其他路线上的 AdventureId 未定义,因此数据只是一个空的 JSON 对象。

所以真正的问题是:如果这个路由器绑定(bind)到“/”而其他“根”绑定(bind)到“/adventure”和“/test”,为什么它们都经过“/:adventrueId” ?

<小时/>

我有一个非常简单的 ExpressJS 应用程序,在该应用程序上,除 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 Router 文档以及我发现的每个博客和示例中,它都说这就是它应该如何工作,所以我在这里真的很茫然。

谢谢。

最佳答案

If this router bound to "/" and the other "roots" are bound to "/adventure" and "/test" why are all of them going through "/:adventrueId"?

因为 Express 不会根据哪个匹配最佳来匹配路由,而是根据哪个匹配第一个来匹配路由。

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

如果你想防止这种情况,请先声明更具体的路由:

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

关于node.js - ExpressJS Router 不处理根路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42837556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com