Express路由定义?radius查询参数时无法获取参数值如何解决
错误根源
Express 做路由匹配时,只会校验URL中?之前的路径部分,?后面的查询字符串不参与路由规则匹配。
你在路由路径里写的?radius=:radius完全不符合Express路由的语法规则:Express路径规则里的?是用来标记前一个路径字符/段为可选的修饰符,不是用来识别查询参数的标记。你写的/:stationId/asset?radius=:radius会被解析成匹配/:stationId/asse后面拼接radius=:radius格式的路径,正常请求/123/asset?radius=456根本命中不了这个路由,自然不会有任何返回。
另外就算路由命中,你原代码里也没有写res响应逻辑,请求会一直处于挂起状态。
正确写法
业务要求用?radius=的查询参数格式的话,完全不需要在路由定义里声明这个参数:
- 路径里的动态参数(比如stationId)还是用冒号语法声明,从
req.params读取 - ?后面的查询参数统一从
req.query对象读取,不需要在路由路径里做任何配置
修正后的代码如下:
app.get('/:stationId/asset', (req, res) => { // 读取路径参数stationId const stationId = req.params.stationId // 读取查询参数radius const radius = req.query.radius console.log('stationId:', stationId) console.log('radius:', radius) // 必须加响应逻辑,否则请求会挂起 res.json({ stationId, radius }) })
补充说明
如果需要校验radius参数是否传递、格式是否符合要求,直接在路由处理函数内写判断逻辑即可:
app.get('/:stationId/asset', (req, res) => { const { stationId } = req.params const { radius } = req.query if (!radius) { return res.status(400).json({ msg: '缺少必填参数radius' }) } // 后续业务逻辑 })
内容的提问来源于stack exchange,提问作者wycherley22
相关产品推荐
相关产品推荐

