gpt4 book ai didi

node.js - expressjs/nodejs 通用路由与通配符冲突

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

full code looks like this

/* /login [get] */
app.get('/login', function(req, res) {
res.render('login');
return;
});


app.get('/stats', requireLogin, function(req, res) {
User.findOne({ _id: req.user.id})
.populate('current')
.exec(function(err, stats) {
if (err) res.json(err)
res.render('stats', stats);
return;
})
});
/* /username */
app.get('/:username', requireLogin, function(req, res) {
console.log("sdf");
User
.findOne({ username: req.params.username }, 'friends')
.exec(function(err, user) {
console.log(user)
})

going to /login renders the login page, but also triggers the console.log of "sdf from the next route

在我的应用程序中,可以访问/someusername

我将该路线定义为

app.get('/:username', function(req, res) {

但是因为我也有这些通用的,例如/stats 和/login

app.get('/stats', function(req, res) {})
app.get('login', function(req, res) {})

访问这些也会访问/:username 路由。

如何防止这种情况发生?

(/:username 路由是代码中的最后一个)

最佳答案

路线由 Express 按顺序处理。所以,如果你输入/stats /:username之前的路线路由,并且您不会通过调用 next() 手动强制路由进一步继续,那么事情就会对你有用。更具体的路线将首先找到并处理。

但是,当 URL 发生冲突时,这可能是一个糟糕的 URL 设计。如果用户名为 "stats 会怎样? ”,那么他们的用户名 URL 将永远无法工作。而且,如果您想要其他 URL,例如 /login/about ,该怎么办。所有这些都会与潜在的用户名冲突。这只是一个糟糕的设计。

也许,您应该更改为这样的内容:

app.get('/user/:username', function(req, res) {...}

因此,任何用户名路由都不能与您的 /stats 发生冲突。路线或您选择的任何其他顶级路线。这将使您的顶级路径可用于将路由定向到类别,并且将是更好的 URL 设计。

<小时/>

而且,正如我们在进一步讨论中发现的那样,请求该页面图标的浏览器也会点击您的 /:username路线。您可以为网站图标创建一个特殊的路由,或者可以在页面中插入元标记以防止网站图标请求,或者您可以停止使用捕获这些类型的内容的顶级通配符路由。请注意,您可能还会发现诸如机器人请求 /robots.txt 之类的情况。也是。

关于node.js - expressjs/nodejs 通用路由与通配符冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43941944/

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