在 expressjs 中捕获复数路由

catch plural route in expressjs

在 expressjs 中,我使用如下路由;

app.use('/game', require("./routes/game"));

在文件中/routes/game.js

const express = require('express');  
var router = express.Router();

router.get("s", function (req, res, next) {
    res.send("GAME LIST");
})
router.get("/:gameurl", function (req, res, next) {
    res.send(`GAME: ${req.params.gameurl}`);
})

module.exports = router;

我想同时捕获 /games/game/wow
我如何设法分别处理这两条路线?

如果您希望 /games/game 都转到您的路由器,而不是任何其他顶级路径,则有多种方法可以指定它。你可以看到他们描述 here in the doc。例如,您可以使用正则表达式或传递多个字符串。在这种情况下,我将向您展示多个字符串:

 app.use(["/game", "/games"], require("./routes/game"));

对于路由路径,您可以传递单个字符串、路径模式(正则表达式的 Express 子集)、正则表达式或包含这些的任意组合的数组。

如果您想在路由器中分辨出 /game/games 之间的区别,那么您将必须检查 req.originalUrl 以查看是哪一个导致了它。到您的路由器,在我看来,这首先破坏了路由目的的一部分。

因此,将两个单独的顶级路径发送到同一个路由器并在路由器内部以不同方式路由它们并不是一种与 Express 配合良好的设计。就个人而言,我要么改变我的路径设计,这样就不会发生这种情况,要么使用两个路由器,因为这样更适合路由器机制。

你可以这样做

app.use('/', require("./routes/game"));

在文件/routes/game.js

const express = require('express');  
var router = express.Router();

const base = '/game';

router.get(`${base}s`, function (req, res, next) {
    res.send("GAME LIST");
})
router.get(`${base}/:gameurl`, function (req, res, next) {
    res.send(`GAME: ${req.params.gameurl}`);
})

module.exports = router;