04月27, 2018

Koa 框架学习

Koa 框架

koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。 使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套, 并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件, 它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。

在使用上,koa把之前的req,rsp都封装成了一个ctx对象,而且koa开始全面支持async函数并准备在以后的版本中弃用Generator函数。官方例子

如果你之前使用过express使用koa几乎没有门槛,它们几乎一样。

Application 对象

app.listen(...)

同http.listen(...),在源码中Koa也是直接调用的http.listen()

app.listen = function listen() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

app.callback()

返回适用于 http.createServer() 方法的回调函数来处理请求。你也可以使用此回调函数将 koa 应用程序挂载到 Connect/Express 应用程序中。

//让一个app 同时支持http和https
const http = require('http');
const https = require('https');
const Koa = require('koa');
const app = new Koa();
http.createServer(app.callback()).listen(80);
https.createServer(app.callback()).listen(443);

app.use(middleware)

挂载中间件的方法,相比express,koa去掉了默认的路由,如果需要路由需要添加中间件koa-router

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

// 记录日志
app.use(async (ctx, next) => {
    const start = Date.now();
    await next();
    ctx.set('X-Response-Time', `${Date.now() - start}ms`);
    console.log(`${ctx.method} ${ctx.url} - ${Date.now() - start}ms`)
});

app.use(router.routes())
    .use(router.allowedMethods());


router.get('/', function (ctx) {
    ctx.body = "I am Index Page";
});

router.get('/hello', function (ctx) {
    ctx.body = "hello world";
});

Context 上下文

Context是应用程序的上下文对象,每一个请求都会创建一个Context对象,它包含了所有的请求响应信息。每个中间件的第一个参数应该是它。

app.use(async ctx => {
  ctx; // 这是 Context
  ctx.app;//应用程序实例引用
  ctx.request; // 这是 koa Request
  ctx.response; // 这是 koa Response
  ctx.req;// 这是 node req
  ctx.res;// 这是 node res
  ctx.cookies// cookies 对象
});

ctx.throw([status], [msg], [properties])

throw方法抛出一个 .status 属性默认为 500 的错误,这将允许 Koa 做出适当地响应。

ctx.throw(400);
ctx.throw(400, 'name required');
ctx.throw(400, 'name required', { user: user });

ctx.assert(value, [status], [msg], [properties])

当 !value 时,Helper 方法抛出类似于 .throw() 的错误。这与 node 的 assert() 方法类似.

ctx.assert(ctx.state.user, 401, 'User not found. Please login!');

其他和koa.request,koa.response

这里比一一列出,查看中文文档即可

request 对象

koa相比express去掉了太多的东西,感觉没啥好说的,毕竟所有的东西基本都要使用中间键

response 对象

如同request,response也去掉了大量现成的方法,现在直接往前端返回数据直接使用response.body = 'hello world'这种形式。而且多次设置时后者会覆盖前者。

本文链接:https://www.qiangshuidiyu.xin/post/koa.html

-- EOF --

Comments