推荐答案
在 Koa 中,可以通过 ctx.query
或 ctx.request.query
来获取查询参数。这两个属性会返回一个包含所有查询参数的对象。
-- -------------------- ---- ------- ----- --- - --------------- ----- --- - --- ------ ------------- ----- -- - ----- ----------- - ---------- -- ---- ----------------- -------- - ------------ --- ---------------- -- -- - ------------------- -- ------- -- ------------------------ ---
例如,访问 http://localhost:3000/?name=John&age=30
,ctx.query
将返回 { name: 'John', age: '30' }
。
本题详细解读
1. ctx.query
和 ctx.request.query
的区别
ctx.query
是ctx.request.query
的简写形式,两者实际上是等价的。- 它们都返回一个包含查询参数的对象,其中键是参数名,值是参数值。
2. 查询参数的解析
- Koa 使用
koa-qs
中间件来解析查询字符串。默认情况下,Koa 会自动解析查询字符串并将其转换为对象。 - 如果查询字符串中有重复的参数名,
ctx.query
会将这些值合并为一个数组。
3. 示例
假设访问的 URL 是 http://localhost:3000/?name=John&age=30&hobby=reading&hobby=traveling
,那么 ctx.query
将返回:
{ name: 'John', age: '30', hobby: ['reading', 'traveling'] }
4. 注意事项
- 查询参数的值始终是字符串类型。如果需要数字或其他类型,需要手动转换。
- 如果查询字符串中包含特殊字符(如
&
或=
),Koa 会自动进行 URL 解码。
5. 自定义查询参数解析
如果需要自定义查询参数的解析方式,可以使用 koa-qs
中间件进行配置,或者手动解析 ctx.querystring
。
const querystring = require('querystring'); app.use(async (ctx) => { const queryParams = querystring.parse(ctx.querystring); ctx.body = queryParams; });
这种方式可以更灵活地处理查询字符串,但通常 ctx.query
已经足够满足大多数需求。