- 首先要安装koa-body用于解析请求数据
默认koa2-cli 自动生成的项目,采用的是koa-bodyparser, 这个sdk主要用开解析处理POST请求参数,但是这玩意有点缺陷,只能处理request payload 请求,
如:我们上传图片,需要传入的是图片的file 二进制流,所以采用request payload 就产生了问题!所以这个时候,如果你想用form data的格式,就需要继续依赖其他的sdk,如: koa2-formidable,
为什么使用koa-body?
在使用XMLHttpRequest2发送的FormData数据时,koa服务中除koa-body外,busboy、body-parse、multer、formidable、multiparty,均无法正确获取,也是经过经过测试发现的问题。
支持请求类型
- multipart/form-data
- application/x-www-urlencoded
- application/json
使用koa-body 使用案例
const Koa = require('koa'); const app = new Koa(); const koaBody = require('koa-body'); app.use(koaBody({ multipart:true, // 支持文件上传 // encoding:'gzip', }));
这里需要注释掉 encoding:'gzip' ,因为发现加上这个,回导致所有的请求出错,具体原因需要下次单独去探究
用上koa-body 其他地方就很easy 了,这是我的主要函数,
const OSS = require('ali-oss'); let fs = require('fs'); // 一些oss 的配置项 const client = new OSS({ accessKeyId: 'xxxx', accessKeySecret: 'xxxx', bucket: 'xxx', region: 'xxxxx' }); exports.upload = async (ctx, next) => { if ('POST' !== ctx.method) return await next(); let file = ctx.request.files.file; try { const reader = fs.createReadStream(file.path); const myDate = new Date(); var newFilename = myDate.getTime()+'.'+file.name.split('.')[1]; await client.putStream(`article-img/${newFilename}`, reader); ctx.body = { code: 0, message: '上传成功' } } catch (err) { ctx.body = { code: -2, message: '上传失败' } } };
这个博客的内容比较简单,今天我在这个上面花了不少时间,主要是在于使用了 koa-bodyparser 来解析请求,走了不少弯路,看到这个博客的人,希望可以跳过其他的无用功,直接使用 koa-body