0

我们正在使用 express 框架创建一个 NodeJS 应用程序。在使用路由器参数时,我们遇到了意外的行为。由于我们没有准备好前端,因此正在 postman 中测试 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 ”,收到的响应是“测试二”,它应该响应“测试一”。通过更改路由器的顺序,我可以获得预期的响应“测试一个”。我们无法推断出这种行为。

4

1 回答 1

1

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

首先,我假设这个路由器被分配给 /api,所以它可以看到所有以 /api 开头的路由。您没有显示该代码,但它似乎是您必须做的。

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

通过更改路由器的顺序,我可以获得预期的响应“测试一个”。我们无法推断出这种行为。

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

一般规则是这样的:“如果您有多个可以匹配给定 URL 的路由,请将不太通用的路由放在更通用的路由之前,这样它们就有机会匹配适合它们的 URL”。如果你不这样做,那么不太通用的路由将永远不会有机会匹配,因为更通用的路由将首先匹配并在其他人有机会看到它们之前“处理”请求。

于 2018-10-11T13:38:54.090 回答