语境(Context)本系列文章的应用实例已发布在GitHub上:koa-docs-Zh-CN。您可以通过Fork帮助改进或Star以关注更新。欢迎使用Star.Koa上下文将节点的请求和响应对象封装到单个对象中,为编写Web应用程序和API提供了许多有用的方法。这些操作在HTTP服务器开发中经常使用,并且它们是在这个级别而不是更高级别的框架中添加的,这将迫使中间件重新实现此通用功能。每个请求都会创建一个Context并在中间件中引用它作为接收者,或ctx标识符,如下代码片段所示:app.use(asyncctx=>{ctx;//ThisistheContextctx.request;//这是koaRequestctx.response;//这是koaResponse});为了方便起见,许多上下文的访问器和方法直接委托给它们的ctx.request或ctx.response,否则它们是相同的。比如ctx.type和ctx.length被委托给response对象,ctx.path和ctx.method被委托给request。APIContext具体方法和访问器。ctx.reqNode的请求对象。ctx.resNode的响应对象。__不支持__绕过Koa的响应处理。应避免以下节点属性:res.statusCodes.writeHead()res.write()res.end()ctx.requestkoa'sRequestobject.ctx.responsekoa'sResponseobject.ctx.stateRecommendednamespaceforpassinginformationthroughmiddlewareandyourfront-端视图。ctx.state.user=awaitUser.find(id);ctx.app应用实例参考ctx.cookies.get(name,[options])通过选项获取cookiename:signed请求的cookie需要签名koa使用cookies模块,只需要传递参数。ctx.cookies.set(name,value,[options])通过options设置cookie名称的值:maxAge一个数字表示从Date.now()signedcookiesignaturevalueexpiresDatepathcookie路径时获取的毫秒数cookie过期,默认为'/'domaincookie域名securesecurecookiehttp只有服务器可以访问cookie,默认为trueoverwrite一个布尔值,表示是否覆盖之前设置的同名cookie(默认为__false__)。如果为true,则在同一请求中设置相同的名称设置此cookie时是否从Set-Cookieheader中过滤所有cookie(无论路径或域)。koa使用cookies模块传递简单的参数。ctx.throw([status],[msg],[properties])Helper方法抛出错误,.status属性默认为500,这将允许Koa做出适当的响应。允许以下组合:ctx.throw(400);ctx.throw(400,'namerequired');ctx.throw(400,'namerequired',{user:user});例如ctx.throw(400,'namerequired');required')等同于:consterr=newError('namerequired');错误状态=400;err.expose=true;抛出错误;请注意,这些是用户级别的错误并带有err.expose标记,这意味着该消息是针对客户端响应的,通常不是错误消息的内容,因为您不想泄露失败详细信息。您可以选择将属性对象传递到错误中,这对于加载上传到请求者的机器友好错误很有用。这对于整理其人性化错误并将其向上游报告给请求者很有用。ctx.throw(401,'access_denied',{user:user});koa使用http-errors来创建错误。ctx.assert(value,[status],[msg],[properties])Helper方法在!value时抛出类似于.throw()的错误。这类似于节点的assert()方法。ctx.assert(ctx.state.user,401,'未找到用户。请登录!');koa使用http-assert作为断言。ctx.respond要绕过Koa内置的响应处理,你可以显式设置ctx.respond=false;。如果您想写入原始res对象而不是让Koa处理您的响应,请使用此参数。请注意,Koa不支持使用此功能。这可能会破坏Koa中间件和Koa本身的预期功能。使用这个属性被认为是一种hack,对于那些希望在Koa中使用传统的fn(req,res)功能和中间件的人来说只是一种方便。Requestaliases以下访问器等同于Requestaliases:ctx.headerctx.headersctx.methodctx.method=ctx.urlctx.url=ctx.originalUrlctx.originctx.hrefctx.pathctx.path=ctx.queryctx.query=ctx.querystringctx.querystring=ctx.hostctx.hostnamectx.freshctx.salectx.socketctx.protocolctx.securectx.ipctx.ipsctx.subdomainsctx.is()ctx.accepts()ctx.acceptsEncodings()ctx.acceptsCharsets()ctx.acceptsLanguages()ctx.get()Responsealiases以下访问器等同于Responsealiases:ctx.bodyctx.body=ctx.statusctx.status=ctx.messagectx.message=ctx.length=ctx.lengthctx.type=ctx.typectx.headerSentctx.redirect()ctx.attachment()ctx.set()ctx.append()ctx.remove()ctx.lastModified=ctx.etag=如果本文对您有帮助,请点赞或starGitHub:koa-docs-Zh-CN支持,谢谢。
