通配符*响应所有请求的路由

时间:2018-11-11 04:32:41

标签: javascript node.js express routes

我有一个使用Express.js框架构建的Node.js应用程序。应用中的所有路线均为发布路线,即。

app.post('/login', function(req, res){
//do login validation
});

app.post('/AppHomepage', function(req, res){
//send user app dashboard
});
etc.

我遇到的一个问题是,如果用户输入了未定义的路线,例如appdomain.com/thisroutedoesnotexist,它们将被返回“无法获取/ thisroutedoesnotexist”

因此,我遵循了以下答案中的建议:https://stackoverflow.com/a/25216843并添加了

app.get('*', function(req, res) {
res.redirect('/');
});

作为最后一条路线。对于将未定义的请求重定向到索引页并解决此问题,此方法非常好。

但是,我发现发出LEGITIMATE请求时也会调用此通配符重定向。即。如果用户请求/ AppHomepage,则两者

app.post('/AppHomepage', function(req, res){
//send user app dashboard
});

AND

app.get('*', function(req, res) {
res.redirect('/');
});

捕获并响应该请求。用户确实确实获得了正确的主页渲染,但是索引路由内的console.log也正在打印,这意味着即使在app.post('/ AppHomepage')路由具有拿起并满足了请求。

有人能解释为什么会发生这种情况吗?

编辑:

我现在知道,即使浏览器发出的POST请求也将是GET,这就是GET通配符在重定向中使用的原因。

我的问题现在是否有办法仅重定向未定义的请求,而不重定向所有GET请求?

2 个答案:

答案 0 :(得分:0)

如果您正在浏览器中进行测试,则默认情况下,所有请求都将是“ GET”请求,并且您已经说过所有请求均为“ POST”类型,因此请尝试使用邮递员或其他类似的api测试工具

答案 1 :(得分:0)

[已解决]

因此,某些浏览器发现此问题是恶意的次要网站图标请求。最初定义的请求确实确实是由相应的路由处理程序处理的,但是某些浏览器(例如Google Chrome)倾向于发送次要的图标请求,这些请求与用户发起的请求分开并告知用户。

这是未定义的请求,并由最终的通配符路由器接收。没有此类流氓行为的浏览器包括macOS上的Apple Safari,并说明了此问题不能100%重现的原因。

解决方案是创建一个空的favicon路由器来处理此类请求,前提是该请求来自浏览器,该浏览器具有非用户启动的行为,例如Google Chrome。