Node.js Экспресс-маршрут именования и порядка: как определяется приоритет?
Скажем, у меня есть несколько маршрутов GET в моем приложении Express:
// music albums
app.get('/api/albums', routes.albums.getAlbums);
app.get('/api/albums/:id', routes.albums.getAlbum);
app.get('/api/albums/artwork', routes.albums.getAlbumArtwork);
и я пытаюсь ударить их, используя следующий фрагмент jQuery AJAX:
$("#retrieveAlbumArtwork").on("click", function() {
$.ajax({
url: "api/albums/artwork",
type: "GET",
data: {
artist: $("#albumArtist").val(),
title: $("#albumTitle").val()
},
// ... callbacks and such
По какой-то причине этот вызов попадает во второй обработчик с параметром /:id
вместо явного маршрута /artwork
. Таким образом их свопинг делает их функционирующими, как ожидалось:
// music albums
app.get('/api/albums', routes.albums.getAlbums);
app.get('/api/albums/artwork', routes.albums.getAlbumArtwork);
app.get('/api/albums/:id', routes.albums.getAlbum);
Может кто-нибудь объяснить, почему это происходит? Я бы предположил, что Express будет достаточно умным, чтобы идентифицировать id param (/albums/23453243
) по сравнению с запросом (/albums/artwork?artist=artistName&title=albumTitle
) и соответствующим образом маршрутизировать, но это, похоже, не так?
Ответы
Ответ 1
Нет, это не так. :id
будет соответствовать чему угодно. Таким образом, /api/albums/artwork
полностью подходит для этого соответствия. Express поддерживает также соответствие RegExp. Таким образом, вы можете сделать явный маршрут с числовым сопоставлением, используя RegExp.
Другим вариантом является использование app.param в качестве объяснения в документации API здесь
http://expressjs.com/api.html#app.param
Это позволяет вам определить соответствующие параметры для маршрутизатора, чтобы вы могли иметь URL-адрес, например /api/albums/:albumId
, где :albumId
должен быть числовым, вы также можете подтвердить albumId
в этот момент, если хотите.
Но во втором случае вы делаете это довольно нормально, обычно ставят статические маршруты вверху, затем динамические маршруты, ловят все, а затем обработчики ошибок.