大家好, 我是耗子
上一篇文章跟大家分享了 如何优雅的处理Form表单数据
这篇文章我们来聊聊, 后端 Koa 如何解析表单数据。
一般来说表单数据有三种类型:
-
application/x-www-form-urlencoded(默认)浏览器会将表单数据转换 k1=v1&k2=v2&k3=v3... 这种格式的字符串。
-
multipart/form-data在表单中有文件需要上传, 必须设定的类型。
内容以
------***boundary开始及分割, 最终总内容以------***boundary--结束 -
text/plain同样以键值对的方式发送。
-
除此之外, 也可以提取表单数据, 以
application/json的类型发送Ajax请求, 道理类似。
使用 koa-bodyparser 解析报文
这是 koa-generaotr 默认配置的报文体解析器, 能够解析除 multipart/form-data 以外的数据类型
const bodyparser = require('koa-bodyparser');
// middlewares
app.use(bodyparser({
enableTypes:['json', 'form', 'text'],
encode: "utf-8"
}));
如果不配置, 默认接受 json 和 form 数据
还可以通过配置 extendTypes 属性将其他类型转化为 json, form 和 text, 这样就能够应付大多数的数据类型, 包括 application/x-javascript 等。
app.use(bodyParser({
extendTypes: {
json: ['application/x-javascript'] // will parse application/x-javascript type body as a JSON string
}
}));
其次, 通过 ctx.request.rawBody 可以访问解析前的原文。
使用 multer 解析 formData 类型
如果我们的表单中涉及文件上传, koa-bodyparser 将无法应对了。
为了解析 multipart/form-data 类型, 我们需要引入 multer 和 koa-multer 来进行解析。
-
解析非文件字段
加入中间件,
multer().none()进行解析const multer = require('@koa/multer') router.get('/login', multer().none(), login); -
获取单一文件字段
使用
multer().single("keyname")就可以获取。const multer = require('@koa/multer') router.get('/update', multer().single('file'), (ctx, next)=>{ console.log(ctx.file); // file 对象 await next(); }); -
多文件
使用
mutler().fields({ name: "keyName" , ...option})类似通过
ctx.files获取file数组。
这样就完成了多种文件类型的解析。
结语
如果我的文章对你有帮助, 你的点赞是对我最大的帮助, 谢谢!