koa2学习笔记

文章发布于2020年04月12日 15:03, 归类于: Node.js

文档

https://koa.bootcss.com/

安装

npm i koa

1、第一个应用程序,hello wold

const Koa = require('koa');
const app = new Koa();

app.use(async ctx =>{
  ctx.body = 'Hello World,koa!';
});

app.listen(3000);
node app.js

访问http://127.0.0.1:3000/

级联

const Koa = require('koa');
const app = new Koa();

// logger
app.use(async (ctx, next) => {
  await next();
  const rt = ctx.response.get('X-Response-Time');
  console.log(`${ctx.method} ${ctx.url} - ${rt}`);
  console.log(1)
});

// x-response-time
app.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  ctx.set('X-Response-Time', `${ms}ms`);
  console.log(2)
});

// response
app.use(async ctx => {
  ctx.body = 'Hello World';
  console.log(3)
  
});

app.listen(3000);

打印结果是3->2->1

  1. logger中间件执行‘await next()’->
  2. x-response-time中间件执行‘await next()’->
  3. response执行完且后没有更多中间件->恢复执行其上游行为->
  4. x-response-time中间件->
  5. logger中间件

当在下游没有更多的中间件执行后,堆栈将展开并且每个中间件恢复执行其上游行为。

上下文(Context)

request、response

app.use(async ctx => {
  ctx; // 这是 Context
  ctx.request; // 这是 koa Request
  ctx.response; // 这是 koa Response
});

ctx.state

推荐的命名空间,用于通过中间件传递信息和你的前端视图。

ctx.state.user = await User.find(id);

错误处理

app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    let code = err.statusCode || err.status || 500;
    ctx.response.status = code;
    ctx.response.body = {
      message: err.message + ' code:' + code
    };
    // 手动释放error事件
    ctx.app.emit('error', err, ctx);
  }
})


// 继续触发error事件
app.on('error',(err,ctx) => {
  // console.error('server error-------', err.message);
  console.error('err-------',err.toString());
  console.error('ctx-------',ctx);
});

ctx.app.emit

// 手动释放error事件
ctx.app.emit('error', err, ctx);

app.on('error',(q,p)=>{
  // q,p
})

Request 别名

以下访问器和 Request 别名等效:

ctx.header
ctx.headers
ctx.method
ctx.method=
ctx.url
ctx.url=
ctx.originalUrl
ctx.origin
ctx.href
ctx.path
ctx.path=
ctx.query
ctx.query=
ctx.querystring
ctx.querystring=
ctx.host
ctx.hostname
ctx.fresh
ctx.stale
ctx.socket
ctx.protocol
ctx.secure
ctx.ip
ctx.ips
ctx.subdomains
ctx.is()
ctx.accepts()
ctx.acceptsEncodings()
ctx.acceptsCharsets()
ctx.acceptsLanguages()
ctx.get()

Response 别名

以下访问器和 Response 别名等效:

ctx.body
ctx.body=
ctx.status
ctx.status=
ctx.message
ctx.message=
ctx.length=
ctx.length
ctx.type=
ctx.type
ctx.headerSent
ctx.redirect()
ctx.attachment()
ctx.set()
ctx.append()
ctx.remove()
ctx.lastModified=
ctx.etag=

响应状态

response.status= 通过数字代码设置响应状态:

100 "continue"
101 "switching protocols"
102 "processing"
200 "ok"
201 "created"
202 "accepted"
203 "non-authoritative information"
204 "no content"
205 "reset content"
206 "partial content"
207 "multi-status"
208 "already reported"
226 "im used"
300 "multiple choices"
301 "moved permanently"
302 "found"
303 "see other"
304 "not modified"
305 "use proxy"
307 "temporary redirect"
308 "permanent redirect"
400 "bad request"
401 "unauthorized"
402 "payment required"
403 "forbidden"
404 "not found"
405 "method not allowed"
406 "not acceptable"
407 "proxy authentication required"
408 "request timeout"
409 "conflict"
410 "gone"
411 "length required"
412 "precondition failed"
413 "payload too large"
414 "uri too long"
415 "unsupported media type"
416 "range not satisfiable"
417 "expectation failed"
418 "I'm a teapot"
422 "unprocessable entity"
423 "locked"
424 "failed dependency"
426 "upgrade required"
428 "precondition required"
429 "too many requests"
431 "request header fields too large"
500 "internal server error"
501 "not implemented"
502 "bad gateway"
503 "service unavailable"
504 "gateway timeout"
505 "http version not supported"
506 "variant also negotiates"
507 "insufficient storage"
508 "loop detected"
510 "not extended"
511 "network authentication required"

转载请注明来源:《 koa2学习笔记》- rojerYong's Blog

文章链接:https://www.eoway.cn/article/1586675008.html

如果此文摘取了你的原创,请联系本站管理员,将对此文修改、删除处理。

--END--
上一篇:nginx配置https 下一篇:微信小程序路由跳转