GET
GET数据的处理:GET一般都是请求页面,不过也可以传传form表单,一起看看
html代码
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>Page Title</title>
</head>
<body>
<form action="http://localhost:7000" method="GET">
用户名: <input type="text" name="username"><br>
密码:<input type="password" name="userpassword"><br>
<button>提交</button>
</form>
</body>
</html>
上传的数据在ctx.query对象中:ctx.query
const Koa = require("koa");
let server = new Koa();
server.listen(7000);
server.use(async ctx=> {
console.log(ctx.query);
ctx.body="上传成功";
})
POST
处理纯文字的POST数据:比如用户名 密码等
先安装一个中间件 这个koa-better-body可以接文字类 也可以接图片 视频 也可以接JSON等
npm install koa-better-body -D
中间件中使用了generators,需要转换为async:
npm i koa-convert -D
const Koa = require("koa");
const body = require('koa-better-body');
const convert = require('koa-convert');
let server = new Koa();
server.listen(7000);
server.use(convert(body())) // 使用转换成async的中间件
// 因为要使用body,所以要在上面解析
server.use(async ctx=> {
if(ctx.url=="/favicon.ico") return;
console.log(ctx.request.fields);
// POST的数据在ctx.request.fields中
})
报错消失并得到结果:
处理文件型的POST数据:比如图片 视频等
html代码:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>Page Title</title>
</head>
<body>
<form action="http://localhost:7000" method="POST" enctype="multipart/form-data">
<!--包含文件要指定enctype="multipart/form-data"-->
用户名: <input type="text" name="username"><br>
密码:<input type="password" name="userpassword"><br>
文件:<input type="file" name="f1"><br>
<button>提交</button>
</form>
</body>
</html>
在koa-better-body中可以写对象,里面的uploadDir指定上传过来的目录;
这个目录要使用绝对路径,一方面是为了防止出错,另一方面是为了以后好迁移;
原生模块path可以把相对路径解析成绝对路径,path.resolve中可以使用魔法变量_dirname,具体看代码
const Koa = require("koa");
const body = require('koa-better-body');
const convert = require('koa-convert');
const path = require('path'); // 原生模块 负责把相对路径解析成绝对路径
let server = new Koa();
server.listen(7000);
server.use(convert(body({
uploadDir: path.resolve(__dirname, './upload') // 指定服务器上的目录
}))) // 使用转换成async的中间件
server.use(async ctx=> {
if(ctx.url=="/favicon.ico") return;
console.log(ctx.request.fields);
// POST的数据在ctx.request.fields中
})
上传后的信息,表示已经成功了。
并且upload中也有对应的文件,但是没有扩展名,这是因为服务器不需要看文件,需要可以收到加,或者下载的时候拼接。