深入应用koa-better-body

元胡媚
2023-12-01

选项:

常用作用选项
改名fields、files
禁用multipart 、buffer
限制maxFleldsSize-20MB、maxFileSize-200MB
maxFields-1000
jsonjsonStrict-true、detectJSON
自定义类型extendTypes、handler

改名:
改名很少使用,除非名字冲突,简单代码:

const Koa = require("koa");
const body = require("koa-better-body");
const convert = require("koa-convert");
let server = new Koa();

server.listen(8000);


server.use(convert(
    body({
        // 更名
        fields: 'aaa',
        files: 'bbb'
    })
))
server.use(async ctx=>{
    // 使用新名字
    ctx.request.aaa 
    ctx.request.bbb
});

禁止文件上传:
用于接口禁止上传文件,默认为true,是允许的,但是为了一些接口(比如所搜框)防止恶意上传,所以需要禁止。

server.use(convert(
    body({
        // 禁止上传文件
        multipart: 'false',
        buffer: 'false'
    })
))

限制上传大小:

  • maxFleldsSize-20MB 限制单个字段(比如:textarea)最多能传多少,默认20MB
  • maxFileSize-200MB 限制单个文件最大是多少M,默认200MB
  • maxFields-1000 限制最多能传多少个字段
    不处理错误的代码:
const Koa = require("koa");
const body = require("koa-better-body");
const convert = require("koa-convert");
const path = require("path");
let server = new Koa();

server.listen(8000);


server.use(convert(
    body({
        uploadDir: path.resolve(__dirname, 'upload'),
        maxFileSize: 100*1024
    })
))
server.use(async ctx=>{
    console.log(ctx.request.fields);
    ctx.body = '上传成功'
});

简单的提示:

const Koa = require("koa");
const body = require("koa-better-body");
const convert = require("koa-convert");
const path = require("path");
let server = new Koa();

server.listen(8000);

server.use(async (ctx, next)=> {
    try {
        await next();
        // 在这里使用next() 在catch中捕获
    } catch (error) {
        console.log("文件过大");
        ctx.body = "文件过大";
    }
})
// 限制文件大小的地址
server.use(convert(
    body({
        uploadDir: path.resolve(__dirname, 'upload'),
        maxFileSize: 100*1024
        // 单位kb
    })
))
server.use(async ctx=>{
    console.log(ctx.request.fields);
    ctx.body = '上传成功'
});

当我们需要把不同的文件分在不同的文件夹中,该如何处理?
其实router.post或get等等中可以依次写多个函数,如:
router的路径中可以写多个处理函数:
router.post(path, f1, f2, f3, f4)

const Koa = require("koa");
const Router = require("koa-router");
const body = require("koa-better-body");
const convert = require("koa-convert");
const path = require("path");
let server = new Koa();
let router = new Router();
server.listen(8000);

router.post('/upload', async (ctx, next)=>{
    try {
        await next();
        // 在这里使用next() 在catch中捕获
    } catch (error) {
        console.log("文件过大");
        ctx.body = "文件过大";
        }
    },
    convert(
        body({
            uploadDir: path.resolve(__dirname, 'upload'),
            maxFileSize: 100*1024
            // 单位kb
        })
    ),
    async ctx=>{
        console.log(ctx.request.fields);
        ctx.body = '上传成功'
    }
);
server.use(router.routes());

这样就可以解决。
判断错误信息:
catch中的e有一个message,这里可以看到错误信息:如文件过大
maxFileSize exceeded, received 130923 bytes of file data
状态码选择

const Koa = require("koa");
const Router = require("koa-router");
const body = require("koa-better-body");
const convert = require("koa-convert");
const path = require("path");
let server = new Koa();
let router = new Router();
server.listen(8000);

router.post('/upload', async (ctx, next)=>{
    try {
        await next();
        // 在这里使用next() 在catch中捕获
    } catch (e) {
        if(e.message.startsWith('maxFileSize exceeded')){
            // 如果错误信息以文件为开始报错则提示文件过大
            ctx.status = 406;
            ctx.body = '文件过大'
        }else{
            // 其他故障 比如写错代码报500
            ctx.body = '500服务器错误'
        }
        // console.log(e.message)
        // ctx.body = "文件过大";
        }
    },
    convert(
        body({
            uploadDir: path.resolve(__dirname, 'upload'),
            maxFileSize: 100*1024
            // 单位kb
        })
    ),
    async ctx=>{
        console.log(ctx.request.fields);
        ctx.body = div.txt
        // 故意写错的代码
    }
);
server.use(router.routes());

封装: 不封装了,太累了
有时间在研究
json

  • jsonStrict: true 传过来的JSON默认是true, 表示必须严格模式(名也需要双引号),非严格模式(名字可以不需要双引号)
  • detectJSON: 测试自定义的数据是否是json

自定义类型
很少用。

 类似资料: