Express配置可选路由参数时request.params.status为undefined
问题原因
- 核心问题是混淆了Express框架中路径参数与查询参数的解析规则:
你定义的路由/trips/:status?中的:status?是可选路径段参数,只有当URL路径符合/trips/xxx格式时,路径段里的xxx才会被解析到request.params对象的status字段上;直接访问/trips路径时,可选参数status值为undefined。 - 你实际发起的请求
localhost:3002/trips?status="active"中,?后面的内容属于查询字符串参数,这类参数不会被解析到request.params中,因此读取request.params.status会得到undefined。另外你传参时额外给active套了一层双引号,就算用正确方式取参,拿到的值也会带多余的引号字符。
修复方案
根据你的接口设计预期二选一即可:
方案1:沿用路径参数设计
保持现有路由和处理函数代码不变,修改请求地址格式,去掉查询字符串写法,直接把参数值拼在路径中:
localhost:3002/trips/active
此时request.params.status可正常获取到值active,不带路径后缀访问localhost:3002/trips时,status值为undefined,符合可选参数的设计逻辑。
方案2:沿用查询参数传参
保持现有查询字符串的传参逻辑,做两处修改:
- 去掉请求地址里参数值多余的双引号,正确请求地址为:
localhost:3002/trips?status=active
- 修改处理函数里的取参逻辑,从查询对象中读取status值,修改后的处理函数代码如下:
async function getManyTripsCommand(request, response) { console.log(request.query) const status = request.query.status try { const trips = await getManyTrips(status) return response.status(201).json(trips) } catch (err) { return response.status(err.code).json({ status: err.code, message: err.message }) } }
内容的提问来源于stack exchange,提问作者Eli Wennberg Smith
相关产品推荐
相关产品推荐

