koa

450 阅读4分钟

       简单聊一下koa,koa 是express的原半人马打造,因此解决了express中的很多痛点,它的目标是成为一个更小,更具有表现力,更健壮的基于node的web框架。其主要特点是采用ES6中generator来进一步解决回调函数的问题,所以提醒一下大家,之前大家在看ES6的时候看到generator这章就默默翻过去的同学要再去翻翻书了。


环境安装

额,开始之前先搭一下环境吧!因为实在是太简单了哈!哈!哈!(感觉有点傻)

1.koa-generator

koa-generator是一款快速生成koa的脚手架工具

先全局安装

代码块
$ npm install -g koa-generator

接着进入到我们的项目文件夹


代码块

 koa2 <projectName>

大家注意一下,koa1和koa2。

简单介绍一下koa1是使用generator实现异步的,我们知道Express是基于ES5的,当新版本的node支持ES6时Express团队基于ES6的generator编写了web框架koa1,但是吧koa团队超前的基于ES7开发了koa2,koa2是通过Promise和async来实现异步的。(唉,大神们的精神果然值得我们学习)

回到正题上来,生成命令执行结束后我们来安装依赖


代码块

$ npm install


依赖安装完成后我们来启动服务


代码块

$ npm start

然后打开浏览器输入:http://localhost:3000/


这样就代表我们已经安装完成了


我们来简单看下此时的文件结构


bin/www node启动文件

public目录下面的为静态资源

routes/index.js 路由入口

routes/user.js 开发者配置路由的文件

view目录下为页面文件夹

app.js入口文件


2.接下来我们来手动安装一下

进入到工程目录下初始化一下


代码块
npm init

接下来添加我们要安装的koa版本

打开package.json,添加

代码块

"dependencies": {
        "koa": "2.0.0"
   }


安装依赖

代码块
npm install


新建app.js,并添加一下代码

代码块
//在koa2中,我们导入的是一个class,因此用大写的Koa表示
const Koa = require('koa');
// 创建一个Koa对象表示web app本身:
const app = new Koa();
// 对于任何请求,app将调用该异步函数处理请求:
app.use(async (ctx, next) => {
    await next();
    ctx.response.type = 'text/html';
    ctx.response.body = '<h1>Hello, koa2!</h1>';
});
// 在端口8000监听:
app.listen(8000);
console.log('app started at port 8000...');


接下来启动服务


代码块
node app.js


接着访问本机的8000端口就会出现信息了




级联

先写一个最简单的koa应用程序

代码块

const Koa = require('koa');
const app = new Koa();​
app.use(async ctx => {
  ctx.body = 'Hello World';
});
app.listen(3000);


运行一下


看就这么几行简单的代码就构建了一个最简单的应用程序

但是大家可能会问是建立了一个应用程序,但是我写这么一个东西完全没有用啊!

是的,接下来重点来了,试想一下当用户访问我们的网站时,我们对于请求要做很多复杂的处理,不可能是这么简单的返回,在koa中这个概念就是级联我们也可以叫做中间件,再简单一点说就是中间件就像是一个过滤器,可以对请求和响应进行处理。


下面来个简单的例子


代码块
let koa = require('koa');
let app = new koa();
app.use((ctx, next) => {
  console.log("A");
  next(); // next不写会报错
  console.log(5)
});
app.use((ctx, next) => {
  console.log("B");
  next();
  console.log(4)
});
app.use((ctx, next) => {
  console.log("C");
  ctx.body = 'Hello World';
});

当访问http://localhost:3000/时终端如下



可以看到当一个中间件调用 next() 则该函数暂停并将控制传递给定义的下一个中间件。当在下游没有更多的中间件执行后,堆栈将展开并且每个中间件恢复执行其上游行为。


接下介绍几个常用函数:(接下一些会引用到koa官网中的一些内容)

app.listen()

Koa 应用程序不是 HTTP 服务器的1对1展现。 可以将一个或多个 Koa 应用程序安装在一起以形成具有单个HTTP服务器的更大应用程序


代码块
const Koa = require('koa');
const app = new Koa();
app.listen(3000);
//实质为
const http = require('http');
const Koa = require('koa');
const app = new Koa();
http.createServer(app.callback()).listen(3000);


下面的形式也是可以的

代码块
const http = require('http');
const https = require('https');
const Koa = require('koa');
const app = new Koa();
http.createServer(app.callback()).listen(3000);
https.createServer(app.callback()).listen(3001);


app.callback()

用于 http.createServer() 方法的回调函数来处理请求。


app.use(function)

将给定的中间件方法添加到此应用程序


app.keys=

设置签名的 Cookie 密钥。



Context上下文

在node中我们来对请求进行处理的是request对象和response,在koa中对request和response封装到了一个对象中,也就是context对象,不过在接收其中我们一般用ctx,来表示

我们可以试着执行下面的代码:


代码块
let koa = require('koa');
let app = new koa();
app.use(async ctx => {
    ctx.body = ctx; // 这是 Context
    // console.log(ctx);
  });
app.listen(3000); 




这就是所谓的上下文,至于里面具体的API大家可以参考官网