Node ExpressJS:中间件URL路由响应与路由目的地


router.use((req, res, next) => {
if(req.originalUrl == '/api/test'){
//does stuff
res.send(result);
}
next();
})

route.get('/api/test', (req, res) => {
//does stuff
res.send(result)
}

我对整个HTTP web应用程序的安全行为相当陌生,所以我需要问,如果我使用第一种方法来解决一些路由目的地,是否存在漏洞或缺点?

我对整个HTTP web应用程序的安全行为相当陌生,所以我需要问,如果我使用第一种方法来解决一些路由目的地,是否存在漏洞或缺点?

router.use()router.get()之间有两个主要区别,其中一个在某种程度上与此相关:

  1. router.use()匹配任何http谓词,如GET、POST、PUT、OPTION、PATCH等。而router.get()只匹配GET请求,router.post()只匹配POST请求等。

  2. CCD_ 6使用";松散的";匹配算法,其中请求的路由只需要从路由上的路径指定开始,而不是完全匹配。

对于第一点,您的中间件处理程序正在为所有请求路径为/api/test的http谓词执行res.send(response)。这可能不是您想要的,也不是您应该如何编写代码。您应该让您的代码只响应您实际打算支持的路径的http谓词,并使用它做一些有用的事情。其他动词可能应该以4xx状态代码响应(如果您没有它们的处理程序,这将是Express中的默认状态代码(。

对于第二点,您的中间件处理程序是通用的(没有路径集(,并且您已经在检查整个路径,因此该点不相关。

通过一个小的补充,我认为您的中间件方法很好。我想为req.method:添加一张支票

router.use((req, res, next) => {
if(req.method === "GET" && req.originalUrl == '/api/test'){
//does stuff
res.send(result);
// return so the rest of the route handler is not executed
// and we don't call next()
return;
}
next();
});

尽管如此,你也可以用一种更通用的方式来解决你的问题。例如,如果您将一个特定的路由定义放在这个中间件前面,那么它将自动从中间件中豁免,因为它将在中间件运行之前得到处理。Express中的路由是匹配的,并按照它们声明的顺序运行。

router.get('/api/test', (req, res) => {
//does stuff
res.send(result)
});
router.use((req, res, next) => {
// do some middleware prep work on all requests that get here
// ...
next();
});
// other route definitions here that can use the results of the prior middleware

例如,如果您有一些路由需要身份验证,而另一些路由则不需要,则这种情况非常常见。您先放置未经身份验证的路由,然后放置身份验证中间件,然后定义要在身份验证检查之后的路由。

没有"精确的";脆弱性,但有很多缺点。这里的主要区别在于,第一段代码是我们称之为";全局处理程序";。它对每个请求都执行。第二部分只是一条特定的路线。

当您提出请求时,express开始评估它需要做的事情的管道,以便返回响应。首先,它执行所有全局处理程序(如第一个示例(。然后,它开始将路由与处理程序列表进行匹配,如果找到了,它就会执行该函数。

使用第一种方法的风险是破坏链,并且不能正确执行所有全局/本地处理程序。其中一些可能会做一些特定的事情(比如防止你受到某种类型的攻击(。然后,使用第二种方法,您定义的不仅仅是全局处理程序:您定义端点和方法(在您的情况下,它是GET请求(。

当匹配器找到你的路线时,它会自动为你断链(在最简单的情况下(。

还要注意的是,在第一个示例中,您将有一个包含大量if-else语句的单点来确定您想对这个请求做什么。它基本上减轻了表达的需要。。。


Express是以支持多个";中间件";。如果你想根据一些动作做特定的片段,下面是你可以做的:

router.get('/users',
handler1(req, res, next) {
if (req.something) {
next(); // we skip the logic here, but we go to handler2
} else {
// do your magic
res.send(response);
}
},
handler2(req, res, next) {
// you skipped the action from handler1
res.send(anotherResponse); // you MUST send a response in one handler
}

最新更新