简单聊一下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大家可以参考官网