Подтвердить что ты не робот

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) и соответствующим образом маршрутизировать, но это, похоже, не так?

4b9b3361

Ответ 1

Нет, это не так. :id будет соответствовать чему угодно. Таким образом, /api/albums/artwork полностью подходит для этого соответствия. Express поддерживает также соответствие RegExp. Таким образом, вы можете сделать явный маршрут с числовым сопоставлением, используя RegExp.

Другим вариантом является использование app.param в качестве объяснения в документации API здесь http://expressjs.com/api.html#app.param

Это позволяет вам определить соответствующие параметры для маршрутизатора, чтобы вы могли иметь URL-адрес, например /api/albums/:albumId, где :albumId должен быть числовым, вы также можете подтвердить albumId в этот момент, если хотите.

Но во втором случае вы делаете это довольно нормально, обычно ставят статические маршруты вверху, затем динамические маршруты, ловят все, а затем обработчики ошибок.