如何在 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
中存在哪些属性,以确定您要查找的项目。
是否可以像这样在 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
中存在哪些属性,以确定您要查找的项目。