1.1 DOC-Koa 以及中间件学习笔记
级联
next() 暂停当前函数的执行,进行下面函数的执行,然后会到上游next函数执行处,继续向下执行。
const Koa =require('koa')
const app = new Koa()
app.use(async (ctx, next) =>{
console.log(1)
await next()
const rt = ctx.response.get('X-Response-Time')
console.log(`${ctx.method} ${ctx.url} - ${rt}`);
console.log(2)
})
app.use(async (ctx, next) =>{
console.log(3)
const start =Date.now()
await next()
const ms= Date.now() - start
ctx.set('X-Response-Time',`${ms}ms`)
console.log(4);
})
app.use(async ctx =>{
ctx.body='Hello world'
console.log(5)
})
app.listen(3000)
// 1 3 5 4 2
属性
app的属性和方法
app.env
环境变量 默认使NODE_ENV development
app.proxy
//设置代理
app.subdomainOffset
可以监听多个端口
app.callback()
将方法用于 http.createServer https.createServer 或者connect 和express程序
app.use(function)
将给定的中间件方法添加到此应用程序
app.keys
设置Cookie 密匙
app.context
从外部直接向ctx 内部添加属性
app.context.db = db();
app.use(async ctx => {
console.log(ctx.db);
});
错误处理
通过监听 error 事件进行事件处理 app.on('error', err , ctx=> { //ctx 可以继续向下传递 log.error('server error', err) //错误日志 });
ctx 属性
基本属性
ctx.req
ctx.res node 的请求与相应对象
ctx.responce
ctx.request koa 的对象
ctx.state 推荐的进行变量绑定的地方
ctx.app app对象
ctx.app.emit 触发on的绑定事件
ctx.cookies.set 设置cookie
ctx.cookies.get 获取cookis
ctx.throw([status], [msg], [properties]) 通常使用户的错误 而不是服务器的错误
http-errors
ctx.assert(value, [status], [msg], [properties]) 用于断言 当第一个值为false的时候 第二值为错误码 第三个值使message http-assert
Request 别名
以下访问器和 Request 别名等效:
ctx.header 请求的标识头 可设置
ctx.headers ==上面
ctx.method 请求方法 可设置
ctx.url 请求的url 可设置
ctx.originalUrl 获取请求原始URL
ctx.origin 获取URL的来源,包括 protocol 和 host。
ctx.href
ctx.path
ctx.path=
ctx.query
ctx.query=
ctx.querystring
ctx.querystring=
ctx.host
ctx.hostname
http://localhost:3000 -------origin 常用
http://localhost:3000/apple?abc=11111 -------href
/apple?abc=11111 -------originalUrl
/apple -------path 常用
/apple?abc=11111 -------url
{ abc: '11111' } -------query 常用
abc=11111 -------querystring
localhost:3000 -------host
localhost -------hostname
ctx.fresh 检查缓存是否新鲜 也就是内容
没有改变
。 在设置一个或多个这些响应头后应该引用它。ctx.stale 以上面相反
ctx.socket request.socket 返回请求套接字。
ctx.protocol 返回请求协议,“https” 或 “http”。当 app.proxy 是 true 时支持 X-Forwarded-Proto。
ctx.secure 通过 ctx.protocol == "https" 来检查请求是否通过 TLS 发出。
ctx.ip 返回请求的IP
ctx.ips 返回转发过后的多个IP
ctx.subdomains 返回子域名 根据 subdomainsoffset偏移量试着
ctx.is()
检查传入请求是否包含 Content-Type 头字段, 并且包含任意的 mime type。 如果没有请求主体,返回 null。 如果没有内容类型,或者匹配失败,则返回 false。 反之则返回匹配的 content-type。
ctx.accepts() request.accepts(types) 通过类型检查 可以适用switch设置
ctx.acceptsEncodings() request.acceptsEncodings(encodings) encodings检查
ctx.acceptsCharsets() request.acceptsCharsets(charsets) 编码类型检查
ctx.acceptsLanguages() request.acceptsLanguages(langs) 语言类型检查
ctx.get() request.get(field) 返回请求标头。
Response 别名
以下访问器和 Response 别名等效:
ctx.body
ctx.body=
string 写入
Buffer 写入
Stream 管道
Object || Array JSON-字符串化
null 无内容响应
ctx.status 状态码
ctx.status=
ctx.message 信息
ctx.message=
ctx.length= 长度
ctx.length
ctx.type= 获取响应 Content-Type 不含参数 "charset"。
ctx.type
ctx.headerSent 检查是否已经发送了一个响应头。 用于查看客户端是否可能会收到错误通知。
ctx.redirect() response.redirect(url, [alt])
ctx.attachment()将 Content-Disposition 设置为 “附件” 以指示客户端提示下载。(可选)指定下载的 filename 和部分 参数。
ctx.set() 设置响应标头 field 到 value: 用一个对象设置多个响应标头fields:
ctx.append() 用值 val 附加额外的标头 field。
ctx.remove() 移除表头
ctx.lastModified= 将 Last-Modified 标头返回为 Date, 如果存在。 检查最后的更改事件
ctx.etag= 设置etag 头部
response.is(types...) 。这对于创建操纵响应的中间件特别有用。
html-minifier
,可以削减除流之外的所有HTML响应。response.vary(field)
查看在 field 上变化。
response.flushHeaders()
刷新任何设置的标头,并开始主体。
缓存
使用 HTTP 缓存:Etag, Last-Modified 与 Cache-Control Cache-Control 响应头表示了资源是否可以被缓存,以及缓存的有效期。
no-cache 为本次响应不可直接用于后续请求(在没有向服务器进行校验的情况下)
no-store 为禁止缓存(不得存储到非易失性介质,如果有的话尽量移除,用于敏感信息)
private为仅 UA 可缓存
public为大家都可以缓存。
可以添加过期时间 max-age
Etag 响应头标识了资源的版本,此后浏览器可据此进行缓存以及询问服务器。
Etag 响应头字段表示资源的版本
浏览器在发送请求时会带 If-None-Match 头字段,
Last-Modified 响应头标识了资源的修改时间,此后浏览器可据此进行缓存以及询问服务器。
if-modified-since 在请求头中 时间戳
如果没有过过期时间则可以直接适用缓存 返回304 而不返回任何资源
否则返回一个Last-Modified', new Date().toString() 设置新时间
Last updated
Was this helpful?