0

问题

嗨,开发人员,

我在传递开头带有“/”的 id 时遇到问题。

这是日志

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);
    });
});

4

2 回答 2

1

我强烈建议不要这样做。

如果客户端发送了错误的双斜杠,则存在导致该问题的功能性错误,您应该修复该错误,而不是在服务器上提供奇怪的解决方法 - 这样您最终会得到更健壮、可预测和可维护的代码。

如果您试图操纵服务器接受双斜杠作为路由的一部分,则无法保证客户端会尊重该行为,因此您将遇到一个浏览器可以工作而另一个浏览器不能工作的情况。

如果您的节目以斜线开头,例如“/ShowName”,您需要说明,您应该使用 URL 编码转义节目名称 - https://en.wikipedia.org/wiki/Percent-encoding

于 2020-02-03T01:09:05.317 回答
0

是的,这不太可能奏效,因为 Express 不知道:idURL 模式匹配的其余部分在哪里结束以及从哪里开始。

你不能手动解析 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}`);

于 2020-02-03T00:56:31.630 回答