在Koa框架中,ctx(上下文对象)暴露了哪些常见的属性和方法?请举例说明其用途。
考察说明
考察对Koa核心Context对象的掌握,理解其在请求-响应生命周期中的角色。
回答思路
- 【回答框架 1】Koa的Context对象是请求和响应对象的封装,在中间件中作为参数传递,挂载了request和response的常用属性。核心属性包括ctx.request(请求对象)、ctx.response(响应对象)和ctx.app(应用实例),以及ctx.req和ctx.res(Node原生对象)。
- 【回答框架 2】ctx上直接暴露了常用方法:ctx.get(field)获取请求头,ctx.set(field, value)设置响应头;ctx.status设置或获取响应状态码,ctx.body设置响应体,ctx.message对应状态码的文本。此外,ctx.method、ctx.url、ctx.path、ctx.query和ctx.querystring分别提供请求方法、URL、路径、解析后的查询参数和原始查询字符串。
- 【回答框架 3】ctx.state用于在中间件间传递自定义数据,ctx.cookies用于读写Cookie,ctx.throw(status, message)用于抛出错误并自动设置响应状态。ctx.assert(condition, status, message)在条件不满足时抛出异常。协商内容可用ctx.accepts()和ctx.acceptsEncodings()等,但需注意版本差异。
- 【关键点 1】ctx封装了请求和响应对象,提供简洁的API。
- 【关键点 2】常用属性如body、status、method、url、query等直接可用。
- 【关键点 3】get/set用于操作请求和响应头。
- 【关键点 4】state用于中间件间传递数据。
- 【关键点 5】throw和assert用于错误处理。
- 【易错点 1】不要混淆ctx.req与ctx.request,前者是Node原生请求对象,后者是Koa封装对象。
- 【易错点 2】ctx.body是响应体,对响应体的修改要在响应发送前完成。
- 【易错点 3】ctx.query是解析后的对象,而ctx.querystring是原始字符串,如需原始查询串不要用ctx.query。