Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Koa专题 - 认识koa #28

Open
kangschampagne opened this issue Apr 11, 2018 · 0 comments
Open

Koa专题 - 认识koa #28

kangschampagne opened this issue Apr 11, 2018 · 0 comments

Comments

@kangschampagne
Copy link
Owner

@kangschampagne kangschampagne commented Apr 11, 2018

什么是 Koa

Koa 通过 node.js 实现了一个十分具有表现力的 HTTP 中间件框架,力求让 Web 应用开发和 API 使用更加地愉快。Koa 的中间件之间按照编码顺序在栈内依次执行,允许您执行操作并向下传递请求(downstream),之后过滤并逆序返回响应(upstream)。

几乎所有 HTTP 服务器通用的方法都被直接集成到 Koa 大约570行源码的代码库中。其中包括内容协商,节点不一致性的规范化,重定向等等操作。

Koa没有捆绑任何中间件。

既然知道它是干嘛用的,需要继续理解上面有提到几个概念:

  1. 什么是中间件框架?
    简单说,中间件(middleware)就是处理HTTP请求的函数,用来完成各种特定的任务,比如检查用户是否登录、分析数据、以及其他在需要最终将数据发送给用户之前完成的任务。它最大的特点就是,所有的请求经过一个中间件的时候都会执行两次,理解这个概念就要熟悉一下洋葱圈模型。
    image

  2. 异步编程模型是什么?
    Node.js 是一个异步的世界,官方 API 支持的都是 callback 形式的异步编程模型。
    callback 具有臭名昭著的嵌套问题,因此社区给出了 Promise,它也内置到了 ECMAScript 2015 中。同时为使用同步的方法写出异步,便引入了 async function 语法糖,可以通过 await 关键字来等待一个 Promise 被 resolve(或者 reject,此时会抛出异常), Node.js 现在的 LTS 版本(8.x)已原生支持。

  3. 如何实现中间件?
    两种方法:async function 或者 common function

// async functions (node v7.6+)
app.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});

// Common function
// 中间件通常带有两个参数 (ctx, next), ctx 是一个请求的上下文(context),
// next 是调用执行下游中间件的函数. 在代码执行完成后通过 then 方法返回一个 Promise.
app.use((ctx, next) => {
  const start = Date.now();
  return next().then(() => {
    const ms = Date.now() - start;
    console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
  });
});
  1. koa中的 context 对象是什么?
    每个中间件都接收一个 Koa 的 Context 对象,该对象封装了一个传入的 http 消息,并对该消息进行了相应的响应。我们可以将一次请求相关的上下文都挂载到这个对象上。同时 Context 上也挂载了 Request 和 Response 两个对象。Koa的 Request 对象提供了用于处理 http 请求的方法,该请求委托给 node http 模块的 IncomingMessage。
    因此学习 Koa,主要弄懂三个部分的 api,包括 请求 API, 响应 API,和 上下文 API。

做点实践

话说光说不做假把式,最近在通过 nuxt 重构 blog,发现确实需要自己学习一下 koa,或者说 node.js 的部分。
笔者开了一个 git,上面整个学习过程的 demo 地址

  1. koa-demo1 最简单的例子,实现一个 http server
  2. koa-demo2 最简单的例子,实现一个 http server,使用 es6
  3. koa-mongodb-demo1 一个连接 mongodb 的 server

从这三个 demo 就可以先明确几个目标:

  1. 学习一个中间件的处理,比如 koa-router 如何处理路由请求?即学习 koa 相关库。
  2. mongodb 的一些使用方法,以及对应的 mongoose 库的一写内容。

第一部分就到这里。通过手打一些 demo,看第三方库,对全局有个把握比较重要。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
1 participant
You can’t perform that action at this time.