node服务器,koa的中间件koa-body,node文件上传,FormData上送

为什么使用koa-body?

在使用XMLHttpRequest2发送的FormData数据时,koa服务中除koa-body外,busboy、body-parse、multer、formidable、multiparty,均无法正确获取,也是经过经过测试发现的问题。

koa-body

koa中间件,一个功能齐全的请求体解析器。支持multipart,urlencoded和json请求体。提供与Express的bodyParser、multer相同的功能。

项目内安装

npm install koa-body 或者 yarn add koa-body

支持请求类型
  • multipart/form-data
  • application/x-www-urlencoded
  • application/json
基本使用案例
const Koa = require('koa');
const koaBody = require('koa-body');
const app = new Koa();
app.use(koaBody());
app.use(ctx => { // 获取参数体中的属性和值
  console.log(`files:${util.inspect(ctx.request.body.fields)}; body:${util.inspect(ctx.request.body.files)}`);
  ctx.body = ctx.request.body;
});
app.listen(3000);
  • 请求示例和结果
$ node index.js
$ curl -i http://localhost:3000/users -d "name=test"
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 29
Date: Wed, 03 May 2017 02:09:44 GMT
Connection: keep-alive

// 解析后的参数体
Request Body: {"name":"test"}%

详情可参见:https://github.com/dlau/koa-body/blob/master/examples/multipart.js

联合koa-router使用案例

通常情况下,最好只在需要时解析主体,如果使用支持中间件组合的路由器,则只能为某些路由注入主体。

const Koa = require('koa');
const app = new Koa();
const router = require('koa-router')();
const koaBody = require('koa-body');
router.post('/users', koaBody(),(ctx) => { // 获取参数体中的属性和值
  console.log(`files:${util.inspect(ctx.request.body.fields)}; body:${util.inspect(ctx.request.body.files)}`);
  ctx.body = ctx.request.body;
});
app.use(router.routes());
app.listen(3000);
// 请求示例和结果
console.log('curl -i http://localhost:3000/users -d "name=test"');
options参数

可用于koa-body的选项。4个自定义选项,其他都来自于raw-body和formidable。

  • koa-body 参数
参数名描述类型默认值
patchNode将补丁写入ctx.req节点中Booleanfalse
patchKoa将补丁写入ctx.request节点中Booleantrue
jsonLimitJSON 数据体的大小限制String / Integer1mb
formLimit限制表单请求体的大小String / Integer56kb
textLimit限制 text body 的大小String / Integer56kb
encoding表单的默认编码Stringutf-8
multipart是否支持 multipart-formdate 的表单Booleanfalse
urlencoded是否支持 urlencoded 的表单Booleantrue
text是否解析 text/plain 的表单Booleantrue
json是否解析 json 请求体Booleantrue
jsonStrict是否使用 json 严格模式,true 会只处理数组和对象Booleantrue
formidable配置更多的关于 multipart 的选项Object
onError错误处理Function
stict严格模式,启用后不会解析 GET, HEAD, DELETE 请求Booleantrue
  • formidable 参数
参数名描述类型默认值
maxFields限制字段的数量Integer1000
maxFieldsSize限制字段的最大值Integer2mb (2 * 1024 * 1024)
uploadDir设置文件上传的文件夹Stringos.tmpDir()
keepExtensions保留原来的文件后缀Booleanfalse
hash如果希望计算传入文件的校验,请将其设置为“sha1”或“md5”Stringfalse
multipart是否支持多文件上传Booleantrue
onFileBegin开始时对文件进行特殊回调。它可以用于在将文件保存到磁盘之前重命名文件等Function
  • formidable的onFileBegin

详情参见:https://github.com/felixge/node-formidable#filebegin

关于严格模式的说明

详情参见: http://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-19#section-6.3

  • GET、HEAD和DELETE请求对请求体没有定义语义,但这并不意味着它们在某些用例中无效。
  • 缺省情况下,koa-body是严格模式
项目配置案例
const Koa = require('koa');
const bodyparse = require('koa-body');
const app = new Koa();
const path = require('path');
const util = require('util');
/**
 * 解析请求体
 * @links: https://github.com/dlau/koa-body
 * 上送数据解析,包括post、get的参数,二进制文件(raw属性)传输等的自动解析到ctx.files和ctx.body中
 */
app.use(
  bodyparse({
    multipart: true, // 支持文件上传
    formidable: {
      uploadDir: path.join(__dirname, 'public/upload/'), // 设置文件上传目录
      keepExtensions: true, // 保持文件的后缀
      maxFieldsSize: 2 * 1024 * 1024, // 文件上传大小,缺省2M
      onFileBegin: (name, file) => { // 文件上传前的设置
        const fp = path.join(__dirname, 'public/upload/');
        if (!fs.existsSync(fp)) { // 检查是否有“public/upload/”文件夹
          fs.mkdirSync(fp); // 没有就创建
        }
        console.log(`bodyparse: name:${name}; file:${util.inspect(file)}`);
      }
    }
  })
);
app.use(ctx => {
  /* body中的信息,如下:
  { 
      fields: { lessonid: '1', bookid: '1', folder: 'gxkt/audio', parse: '1' },
      files: { audioData:
         File {
           domain: null,
           _events: {},
           _eventsCount: 0,
           _maxListeners: undefined,
           size: 47830,
           path: 'E:\\Prj\\nuoya\\upload\\temp\\upload_066afb801e15d501aa2d7b144a394a57',
           name: 'blob',
           type: 'audio/wav',
           hash: null,
           lastModifiedDate: 2018-12-05T06:02:31.049Z,
           _writeStream: [Object] 
       } 
     }
  }
  */
  console.log(`files:${util.inspect(ctx.request.body.fields)}; body:${util.inspect(ctx.request.body.files)}`);
  ctx.body = ctx.request.body;
});
app.listen(3000);
koa-body官方文档

详情参见:https://github.com/dlau/koa-body

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值