![](/img/trans.png)
[英]How to pass data from one route to another nodejs with expressjs
[英]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.