繁体   English   中英

如何使用 ExpressJS/NodeJS 正确路由不同的路径?

[英]How to properly route different paths with ExpressJS/ NodeJS?

我最初遇到一个问题,我的 nodeJS 服务器有两条独立且不同的路径,如下所示:

获取 latlng 坐标附近所有商家Path A

app.get("/:lat/:lng/", (req, res) => {

获取特定业务评论的Path B

app.get('/businesses/:businessID/reviews', (req, res)=>{

只要我修改Path A以添加类别参数:

app.get("/:lat/:lng/:searchCategory", (req, res) => {

Path B抛出错误代码 400 并且不再获取评论。 我想出了一个“创可贴”解决方案,只需像这样扩展Path A中的参数长度:

app.get("/:lat/:lng/category/:searchCategory", (req, res) => {

现在一切都按预期工作,但我想知道发生了什么以及为什么。 我实在找不到解释。 似乎我正在遵循所有 ExpressJS 文档和规则。

完全由通配符(匹配任何东西的规范)组成的路由在 Express 中通常是一个问题。 虽然有时非常仔细的设计可以使这项工作发挥作用,但很容易与其他路由发生冲突,因为通配符路由匹配任何东西,甚至是您想用作不同路由的其他东西。 此外,这些顶级通配符路由通常会导致未来的设计和扩展问题,因为如果您想在将来添加新的顶级路由,您的选择可能会因为您之前允许的通配符路由而受到限制。

最安全的选择和最简单的选择是根本不使用顶级通配符路由。 总是在每条路由上使用一些非通配符前缀,如下所示:

app.get("/loc/:lat/:lng/", ...);

由于这不是顶级通配符,因此只要它们不以/loc开头,就不会与任何其他顶级路由冲突。

然后,您也可以将这些与 go 一起使用,并且不会发生冲突:

app.get("/loc/:lat/:lng/:searchCategory", ...)
app.get('/businesses/:businessID/reviews', ...)

请注意,这里的共同主题是每个路由系列都有自己的顶级非通配符路径段。 在这三种路线的情况下,它们使用/loc/businesses并且清楚地将它们分开,因此它们不会发生冲突。 然后,在/loc中,一个有两个参数,一个有三个参数,这样它们就不会冲突。


如果你想知道为什么这两个冲突:

app.get("/:lat/:lng/:searchCategory", ...)    
app.get('/businesses/:businessID/reviews', ...)

这是因为两者都是三个参数 URL,第一个接受三个通配符,因此它匹配任何三个参数 URL,而不仅仅是实际包含 lat 和 long 值的 URL。

从技术上讲,您可以颠倒这些定义以将它们分开:

app.get('/businesses/:businessID/reviews', ...)
app.get("/:lat/:lng/:searchCategory", ...)    

而且,这会起作用,但是创建一个原则上冲突的 URL 结构,并且仅当您以正确的顺序定义所有路由时才有效,这是一个令人头疼的维护问题,并且容易因代码中的一个简单更改而中断,或者很容易由于过去的通配符路线,当您无法以您想要的方式扩展您的 URL 结构时,在未来的某个时候被装箱。

所以,我的建议是避免顶级通配符路由。 如果每个包含通配符的 URL 都有自己的非通配符顶级说明符,那么所有通配符路由都是唯一分隔的,您不会遇到冲突或排序问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM