我的server.js中有以下代码用于路由中间件:
app.use('/users', require('./routes/user.routes'));
app.use((req, res) => res.status(404).json({code: 404, message: 'HTTP 404 Not Found'}));
以下是我的user.routes.js代码
router.get('/admin/:id', (req, res) => {
return userController.findUserById(req, res);
});
只要我给出它就可以正常工作: localhost:8080 / users / admin / 123 但是当我给你的网址没有id localhost:8080 / users / admin /
它向我发送了此消息:{"code":404,"message":"HTTP 404 Not Found"}
在我看来,它应该指引我走正确路线。我错过了什么吗?
答案 0 :(得分:6)
如果您希望id
参数可选,您可以在路由处理程序中添加?
:
router.get('/admin/:id?', (req, res) => {
return userController.findUserById(req, res);
});
现在,/admin/123
和/admin
都会遇到同一条路线。
但是如果没有传递id
,您的代码可能会失败。如果是这种情况,您应指定2条不同的路线:
router.get('/admin', (req, res) => {
return userController.findUserById(req, res);
});
router.get('/admin/:id?', (req, res) => {
return userController.findDefaultUser(req, res);
});
答案 1 :(得分:3)
我相信您可以通过提供自定义验证器来实现此目的:
router.get('/admin/:id(\\d{0,})', (req, res) => {
...
});
我的验证器检查id
是否为0或更多数字,这将匹配空字符串。如果您的id
不是数字,那么您必须相应地调整正则表达式。请注意,Express使用特殊的正则表达式语法,其规则与普通JavaScript RegExp略有不同,例如在Express 4中,您无法使用*
,因此我必须使用{0,}
代替{ {3}})。
<强>更新强>
使用Mohit Bhardwaj建议的?
是一个更简单的解决方案,但这些方法之间存在细微差别。使用我在上面建议的验证码,您仍然会收到一个id
参数,但它会是一个空字符串,而?
id
将不会出现在params
处所有。这是否重要将取决于您如何使用它。
同样值得注意的是,使用?
也可以匹配/users/admin
,而不会使用尾部斜杠。
如果您不关心将id
字符串作为路由匹配的一部分进行验证,那么我认为使用?
将是可行的方法。
答案 2 :(得分:0)
路由现在需要/ user /之后的id(即使有/ user路由),所以如果没有ID,你将得到404错误。修复此问题的一种好方法是使用/user/detail/:id
作为路由。现在它不会与用户路由冲突。