API 请求由不正确的 Express 路由器处理

API request handled by incorrect Express router

我们正在使用 express 框架创建 NodeJS 应用程序。在使用路由器参数时,我们遇到了意外行为。 API 正在邮递员中进行测试,因为我们还没有准备好前端。有两个API定义如下

var router = express.Router();
router.get('/tif/:test2/:one', (req, res) => {
  res.send("Test two");
});

router.get('/tif/test1/:one', (req, res) => {
  res.send("Test one");
});

module.exports = router;

我们从邮递员那里发出请求“http://localhost:3000/api/tif/test1/1”,收到的响应是 'Test two',其中它应该响应 'Test one'。通过更改路由器的顺序,我可以获得预期的响应 'Test one'。我们无法推断出这种行为。

按照路由在路由器上注册的顺序以及路由器在应用程序上注册的顺序,检查路由是否与传入 URL 匹配。在您的情况下,第一条路由找到与该路由的匹配项并处理请求,并且路由不会继续到任何其他路由处理程序。

首先,我假设此路由器已分配给 /api,因此它可以看到所有以 /api 开头的路由。您没有显示该代码,但它似乎是您必须执行的操作。

因此,因为 '/tif/:test2/:one''/tif/test1/:one' 更通用,并且第一个将匹配您的 URL、/api/tif/test1/1,第二条路线永远不会有机会。

By changing the order of router I am able to get expected response 'Test one'. We are unable to reason out this behavior.

当您将 '/tif/test1/:one' 放在首位时,它会在 /api/tif/test1/1 处获得第一个机会并匹配它,以便您获得所需的行为。

一般规则是这样的:"If you have multiple routes that could match a given URL, put the less general routes first before the more general routes so they get a chance to match a URL that fits them"。如果你不这样做,那么不太通用的路由将永远没有机会匹配,因为更通用的路由将首先匹配并且 "handle" 在其他人有机会看到它们之前请求。