当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
匹配,没有斜线。
如果你不关心validationid
string作为路由匹配的一部分,那么我认为使用?
将是要走的路。
如果你想有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
作为路由。 现在它不与用户路由冲突。