Koa2 使用 koa-bodyparser + multer 解析 formData 等数据类型

3,933 阅读2分钟

大家好, 我是耗子

上一篇文章跟大家分享了 如何优雅的处理Form表单数据

这篇文章我们来聊聊, 后端 Koa 如何解析表单数据。

一般来说表单数据有三种类型:

  • application/x-www-form-urlencoded (默认)

    浏览器会将表单数据转换 k1=v1&k2=v2&k3=v3... 这种格式的字符串。

    image.png

  • multipart/form-data

    在表单中有文件需要上传, 必须设定的类型。

    内容以 ------***boundary 开始及分割, 最终总内容以 ------***boundary-- 结束

    image.png

  • text/plain

    同样以键值对的方式发送。

    image.png

  • 除此之外, 也可以提取表单数据, 以 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"
}));

如果不配置, 默认接受 jsonform 数据

还可以通过配置 extendTypes 属性将其他类型转化为 json, formtext, 这样就能够应付大多数的数据类型, 包括 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 可以访问解析前的原文。

image.png

使用 multer 解析 formData 类型

如果我们的表单中涉及文件上传, koa-bodyparser 将无法应对了。 为了解析 multipart/form-data 类型, 我们需要引入 multerkoa-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 数组。

这样就完成了多种文件类型的解析。

结语

如果我的文章对你有帮助, 你的点赞是对我最大的帮助, 谢谢!