Запрос API обработан неверным маршрутизатором Express - PullRequest
0 голосов
/ 11 октября 2018

Мы создаем приложение NodeJS с использованием Express Framework.При работе с параметрами маршрутизатора мы столкнулись с неожиданным поведением.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 one».Мы не можем объяснить это поведение.

1 Ответ

0 голосов
/ 11 октября 2018

Маршруты проверяются на соответствие входящему URL-адресу в порядке их регистрации на маршрутизаторе и в порядке регистрации маршрутизаторов в приложении.В вашем случае первый маршрут находит совпадение с маршрутом и обрабатывает запрос, а маршрутизация не продолжается ни для каких других обработчиков маршрута.

Прежде всего, я предполагаю, что этот маршрутизатор назначен на / api, поэтому он видит все маршруты, начинающиеся с / api.Вы не показываете этот код, но, похоже, это то, что вы должны делать.

Итак, поскольку '/tif/:test2/:one' является более общим, чем '/tif/test1/:one', и первый из них будет соответствовать вашему URL, /api/tif/test1/1второй маршрут никогда не получает шанса.

Изменяя порядок маршрутизатора, я могу получить ожидаемый ответ «Тестируй один».Мы не можем объяснить это поведение.

Когда вы ставите '/tif/test1/:one' первым, он получает первый шанс на /api/tif/test1/1 и сопоставляет его, чтобы вы получили желаемое поведение.

Общее правило таково: «Если у вас есть несколько маршрутов, которые могут соответствовать заданному URL-адресу, поместите сначала менее общие маршруты перед более общими маршрутами, чтобы они получили возможность сопоставить URL-адрес, который им подходит».Если вы этого не сделаете, то менее общие маршруты никогда не получат шансов на совпадение, потому что более общие маршруты будут совпадать первыми и «обработать» запрос, прежде чем другие получат возможность их увидеть.

...