如何在 ExpressJS 中使用多个路由?

How to Use Multiple Route in ExpressJS?

是否可以像这样在 ExpressJS 中制作路由器?

users.js

const userController = ('../controllers/userController.js');

router.get('/:userName', userController.paramByUsername);
router.get('/:id', userController.paramByUserId);


在控制器中,代码如下所示

userController.js

function paramByUsername(req, res) {
    User.findOne({
        where: {
            userId: req.params.userId
        }
    })
    .then((user) => {
        if(!user) {
            return res.status(404).json({ message: "User not found."});
        }

        return res.status(200).json(user);
    })
    .catch((error) => {
        return res.status(400).json(error);
    });
}

function paramByUserId(req, res) {
    User.findByPk(req.params.id)
    .then((user) => {
        if(!user) {
            return res.status(404).json({ message: "User not found."});
        }
    }).catch((error) => {
        return res.status(400).json(error);
    });
}


通过上面的代码,我想要实现的是这样的端点:
/users/1 这应该响应与 /users/username 相同。

我试过上面的代码,但是当我得到 /users/:id

时,我看到的是一个错误

您不能同时执行这两项操作:

router.get('/:userName', userController.paramByUsername);
router.get('/:id', userController.paramByUserId);

从纯路由的角度来看,无法区分这两者。无论你先声明哪条路线,都会抓住顶层的所有东西,而第二条路线永远不会被击中。

因此,在路由设计中,您必须确保根据您在路由模式中放置的内容,Express 路由匹配器可以唯一识别每条路由。

我想如果 id 始终只是数字而用户名永远不会只是数字,那么您可以使用正则表达式路由并只匹配 id 的数字和用户名的其他所有内容,但是这对我来说似乎有点脆弱,我更喜欢更明确的东西。

我不知道你的应用的整体情况,但你可能想做:

router.get('/user/:userName', userController.paramByUsername);
router.get('/id/:id', userController.paramByUserId);

或者,您可以使用带有 URL 的查询字符串,如下所示:

/search?user=John
/search?id=4889

然后,你只有一条路线:

router.get("/search", ....);

然后您将检查 req.query 中存在哪些属性,以确定您要查找的项目。