1.0.0 • Published 5 years ago

@webxrd/body-parser v1.0.0

Weekly downloads
-
License
ISC
Repository
-
Last release
5 years ago

body-parser(强大的 http报文解析器)



前言

首先: body-parser基于formidable(formidable 1.2.2)之上拓展了额外的功能,功能: 通过添加控制字段 noDownload: true 来阻止文件被自动写入磁盘。并将Buffer数据流 传递给http request。

起因: 无论是formidablemulter还是multipart等body解析器,在提供强大的解析功能时,却在处理文件时并没有提供一个“供使用者可以自己直接操作流数据的功能”。 body-parser由此而生。

例如formidable如果指定uploadDir,则将其下载到uploadDir。 未指定的话:则会默认下载到操作系统内对应的你项目名称的那个temp目录内(也就是操作系统的临时文件,为了验证真实。你可以打印下file.path并去查看下temp目录)。 弊端: 也就是说无论如何 《文件都将被写入磁盘》。而且无法在写入前指定文件名(默认是hash串),你只能在之后通过返回的路径执行rename。 优势: 因为源码上是使用的stream管道流式写入,这么设计的好处就是不会对内存造成压力(因为无需在内存中存储这庞大的文件流)

body-parser提供了解决这种情况的可选项--- noDownload: true 如果你这么做了,那么uploadDir则不会再生效,因为文件不会再被默认写入到任何地方。。而是将Buffer放在file对象上,你可以通过customBinaryStream或customOctetStream来访问它。至此:“写入到哪儿”-“何时写入”与“是否写入”“写入前命名”,这些权利都将直接交给你

body-parser弊端: 假定你使用了 noDownload: true 。(如果你不使用noDownload:true,那么将与formidable无异) 那么意味着文件的数据流在返给你之前,它一直在内存中。不适合高并发的客户端项目,反而是适合少量文件上传的后台管理项目。


安装

npm install @webxrd/body-parser --save

示例————在Express中使用

这里只介绍解构出的 middleware ,它是一个开箱即用的中间件。 (这里form === 原formidable实例,本例不介绍它。欲了解请前往 formidable) 假设前端传来FormData---->>> {fileimg: <binary>}

const formidable = require('@webxrd/body-parser');
const opts = {
    noDownload: true
};// opts将保留formidable 原生的一切opts,唯独多了此noDownload字段,且此字段为true时将会影响uploadDir字段

const { form, middleware } = formidable(opts);
// 通过 use 使用body-parser所提供的开箱即用中间件
app.use(middleware);

app.post('/upload', function (request, response) {
    // 在这里可以打印fields以及files对象。
    console.log(request.fields, '||||||||', 'request.fields')
    console.log(request.files, '||||||||', 'request.files')

    // 在这里可以直接操作Buffer!这是body-parser所提供的特色
    // 获取到的Buffer
    console.log(request.files.fileimg.customBinaryStream)
    const filePath = './static/images/'+ request.files.fileimg.name
    fs.writeFileSync(filePath, request.files.fileimg.customBinaryStream)
    response.json({filePath})
});

app.listen(PORT);

示例————在Koa中使用

// 和Express用法相同。区别只在于,取值时是下面这样:
// ctx.request.fields
// ctx.request.files

options

这里只介绍,@webxrd/body-parser所提供的字段。其他所有字段将和formidable一样。您可以参阅它 | 字段 | 类型 | 说明 | | :--- | :--- | :--- | | noDownload | Boolean | 默认值false,此时body-parser将和formidable没有任何区别。当设置为true时。uploadDir字段将会失效。并且文件不会再写入到uploadDir或操作系统的temp目录下。与此同时。 file.customBinaryStream或file.customOctetStream 两个字段中将会有一个字段提供Buffer流数据。 |

1.0.0

5 years ago