当url参数未被传递时,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); }); 

它工作正常,只要我给: 本地主机:8080 /用户/pipe理员/ 123但是,当我给这个URL没有ID 本地主机:8080 /用户/pipe理员/

它发送给我这个消息: {"code":404,"message":"HTTP 404 Not Found"}

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

我相信你可以通过提供一个自定义validation器来得到这个工作:

 router.get('/admin/:id(\\d{0,})', (req, res) => { ... }); 

我的validation器检查该id是0或更多的数字,这将匹配一个空string。 如果你的id不是数字,那么你将不得不相应地修改正则expression式。 请注意,Express使用一种特殊的正则expression式语法,它与正则expression式RegExp有着稍微不同的规则,例如在Express 4中,您不能使用use *所以我必须使用{0,}来代替(请参阅https:// github。 com / expressjs / express / issues / 2495 )。

更新

使用? 正如Mohit Bhardwaj所build议的是一个更简单的解决scheme,但是这些方法之间有细微的差别。 使用我上面build议的validation器,你仍然会收到一个id参数,但它将是一个空string,而与? id完全不会出现在params中。 这是否重要取决于你如何使用它。

还值得注意的是,使用? 也将允许/users/admin匹配,没有斜线。

如果你不关心validationidstring作为路由匹配的一部分,那么我认为使用? 将是要走的路。

如果你想有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); }); 

现在路由期望在/ user /(即使有一个/用户路由)之后的一个id,所以如果没有ID,你将得到404错误。 解决这个问题的好方法是使用/user/detail/:id作为路由。 现在它不与用户路由冲突。