Как обработать две косые черты подряд в роутере, используя express? - PullRequest
0 голосов
/ 03 февраля 2020

Проблема

Привет, разработчики,

У меня проблемы с передачей идентификатора, в начале которого стоит символ '/' .

Это журнал

GET /api/v1/ GetAnimeInfo//anime/5226/tokyo-ghoul/Tokyo% 20Ghoul 404 0.466 ms - 1310

Как видите, он не может распознать два / после GetAnimeInfo//

Разве нет способа expressjs разрешить мне этот паттерн?

//id = '/anime/5226/tokyo-ghoul/'
//title = 'Tokyo Ghoul'

router.get('/GetAnimeInfo/:id([^/]+/[^/]+[^/]+/[^/])/:title' , (req , res , next) =>{
  let id = req.params.id
  let title = req.query.title;
  api.getAnimeInfo(id , title)
    .then(info =>{
      res.status(200).json({
        info
      });
    }).catch((err) =>{
      console.log(err);
    });
});

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Я бы настоятельно рекомендовал не делать этого.

Если клиент отправляет ошибочную двойную запись sh, существует функциональная ошибка, создающая эту проблему, и вы должны исправить эту ошибку, а не предоставлять странный обходной путь на сервере - таким образом вы получите более надежный , предсказуемый и обслуживаемый код в будущем.

Если вы пытаетесь манипулировать сервером, чтобы принять двойной sla sh как часть маршрутизации, не будет никакой гарантии, что клиенты будут уважать поведение, поэтому вы будете столкнуться с ситуациями, когда один браузер будет работать, а другой - нет.

Если у вас есть шоу, начинающиеся с sla sh, например, «/ ShowName», которые вы должны учитывать, вы должны избегать показать имя с кодировкой URL - https://en.wikipedia.org/wiki/Percent-encoding

0 голосов
/ 03 февраля 2020

Да, это вряд ли сработает, учитывая, что Express не будет знать, где заканчивается :id и где начинается остальное совпадение шаблона URL.

Разве вы не можете просто проанализировать URL вручную ? Не похоже, что это будет так сложно, например,

router.get('/GetAnimeInfo/:idAndTitle', (req, res, next) => {
  const { idAndTitle } = req.params;
  const idx = idAndTitle.lastIndexOf("/") + 1;
  const id = idAndTitle.substring(0, idx);
  const title = idAndTitle.substring(idx, idAndTitle.length);
  ...
});

Демо

const idAndTitle = '/anime/5226/tokyo-ghoul/Tokyo Ghoul';
const idx = idAndTitle.lastIndexOf("/") + 1;
const id = idAndTitle.substring(0, idx);
const title = idAndTitle.substring(idx, idAndTitle.length);
console.log(`ID=${id}`);
console.log(`Title=${title}`);
...