回顾
npm install koa
- application 核心功能创建一个应用
- request koa自己封装的文件 目的是扩展req
- response koa自己封装的文件 目的是扩展res
- context 上下文 整合req和res 核心功能就是代理, 集成了原生的req、res
中间件
- koa-bodyparser
- koa-static
- koa-router
koa-bodyparser
应用 一
写web服务 核心就是接收用户请求的数据 来解析,返回数据
功能
1) 有一个表单,当我访问 /form的时候显示表单
2) 当我点击 按钮时能提交
实现
新建form.html
1 | <!--form.html--> |
新建 1.koa.js
1 | // 1.koa.js |
改进如下:
koa 所有异步都封装成 promise
1 | app.use(async (ctx, next)=>{ |
优化
koa-bodyparser
统一处理请求体 安装第三方包 koa-bodyparser
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 // 1.koa.js
const Koa = require('koa');
const app = new Koa();
const fs = require('fs');
const path = require('path');
const bodyparser = require('koa-bodyparser'); // 它是一个函数
app.use(bodyparser()); // 添加这一行
app.use(async(ctx,next)=>{
if(ctx.path === '/form' && ctx.method === 'GET'){
ctx.set('Content-Type', 'text/html;charset=utf-8');
ctx.body = fs.createReadStream(path.resolve(__dirname,'form.html'));
}else{
await next();
}
});
app.use(async (ctx, next)=>{
if(ctx.path === '/login' && ctx.method === 'POST'){
// 统一处理请求体
ctx.body = ctx.request.body;
// 运行可以看到 服务器端将接收到的值返回给客户端
}
})
app.listen(3000);
手写 bodyparser
1 | // 1.koa.js |
应用 二
新建 form-bodyparser.html, 新增了上传文件类型
1 | <!--from-bodyparser.html--> |
上传图片,提交。
- 上传图片 这里因为 1.koa-bodyparser.js line56 打印数据,所以命令行即服务端打印出了图片的二进制数据,因为是二进制 并且这个文件下载了
- 新建一个 1.txt文件 上传txt文件 可以看到浏览器显示的如图的是form-data格式 现在来自己解析下 通过分隔符将内容分成5分
新建 1.txt
1 | hello word |
1 | // 1.koa-bodyparser.js |
上传的文件都被放在 /upload/ 文件夹下
koa-static
应用
静态文件中间件
1 | <!--form-bodyparser.html--> |
如果 页面中有引用图片 如form-bodyparser.html line11 但是页面中没有显示
1 | // 2.static.js |
koa-router
应用
1】
1 | const Koa = require('koa'); |
2】
1 | const Koa = require('koa'); |
浏览器访问 http://localhost:3000/ 服务端打印 1 2
浏览器访问 http://localhost:3000/user 服务端打印 3 4 5
匹配问题
- 默认路由是严格匹配
- 1、路径相同
- 2、写成正则的方式 //a/b+/
- 3、/a/:name 路径参数 这个name表示占位符 必须要有值
1) 路径严格相同:
1 | const Koa = require('koa'); |
运行 可以看到浏览器输出 hello
如果把line7换成post
1 | const Koa = require('koa'); |
浏览器运行 http://localhost:3000/ 如图:
当前只运行 POST 访问
2) 正则匹配:
1 | // 1)路径严格相同 如下line9 如果写的是/a/b 浏览器访问/a就访问不到 |
3) 路径参数:
1 | const Koa = require('koa'); |
运行 http://localhost:3000/a/1/2 浏览器输出 {“name”:”1”,”id”:”2”}
如果把line9注释打开 浏览器输出 hello ,如果把正则改成 //ab/\d+/ 正则这个匹配不上 还是输出上一个结果
拓展
可以给一个默认的路由前缀如line5 浏览器 http://localhost:3000/a/1/2 也能够正常访问到 并且输出{“name”:”1”,”id”:”2”}
1 | const Koa = require('koa'); |
解决:
1 | // 描述:有个大路由(一级路由) 下面可以挂载2个小路由 (二级路由(/a /b)) |
以上用法一般情况下不用自己建 koa2里面提供了自带的模板
npm install koa-generator -g
里面会生成2个 koa、koa2, koa里面是基于generatore语法的,现在基本不用了,现在用koa2
查看命令行用法 koa2 –help
生成项目 koa2 -e(代表ejs) my-project 生成项目