未传递url param时不会调用Express路由

时间:2017-10-06 09:34:47

标签: node.js express

我的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"}

在我看来,它应该指引我走正确路线。我错过了什么吗?

3 个答案:

答案 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作为路由。现在它不会与用户路由冲突。