Как я могу отключить два маршрута get с одинаковыми параметрами?

#node.js #express

#node.js #выразить

Вопрос:

У меня есть два маршрута.

 app.&et('/api/v1/bucket/:bucket_name', (req, res) =&&t; {

  queries.&etAllFilesFromSpecificBucket(req.params.bucket_name).then(data =&&t; {
    res.json(data);
  });
})

app.&et('/api/v1/bucket/:file_name', (req, res) =&&t; {
  queries.&etSpecificFileByName(req.params.file_name).then(data =&&t; {
    res.json(data);
  });
})
  

Путь к двум из них один и тот же api /v1 / bucket /, за исключением имени параметра.Здесь моя проблема в том, что когда я пытаюсь получить маршрут с параметром file_name, всегда вызывается первый маршрут с параметром bucket_name.
Пожалуйста, помогите

Ответ №1:

Простой ответ — просто изменить один из ваших маршрутов api. Другой вариант — объединить маршруты и использовать параметр запроса

 app.&et('/api/v1/bucket/:name', (req, res) =&&t; {
  if (req.query.bucket === "true") {
   //DO bucket lo&ic
  } else {
  // DO file lo&ic
  }
})
  

Чтобы это сработало, вам нужно обновить свой интерфейсный маршрут примерно так

 const &etBucket = `/api/v1/bucket/${bucketName}?bucket=true`
const &etFile = `/api/v1/bucket/${fileName}?bucket=false` // NOTE you can just remove the ?bucket=false from this line
  

Ответ №2:

Это может сработать, если в вашем bucketname нет . , а имя файла всегда имеет расширение

 app.&et('/api/v1/bucket/:name', (req, res) =&&t; {
    const name = req.params.name;
    if (name.includes(".")) {
        queries.&etSpecificFileByName(name).then(data =&&t; {
            res.json(data);
        });
    } else {
        queries.&etAllFilesFromSpecificBucket(name).then(data =&&t; {
            res.json(data);
        });
    }
})
  

Что будет делать этот код, так это проверяет, :name есть . или нет, если есть, то он получит файл по имени файла, если нет, то он получит все файлы внутри имени корзины

Например:

  • example.jp& -&&t; файл
  • .example -&&t; файл
  • example -&&t; корзина

Но если вы хотите сделать его более REST, то я думаю, что имеет смысл изменить ваш маршрут, например:

  • /api/v1/buckets/:bucketName/files : получить все файлы внутри корзины
  • /api/v1/buckets/:bucketName/files/:fileName : получение файла по имени файла внутри корзины
  • /api/v1/files/:fileName : получение файла по имени файла в любом сегменте