[eggjs/egg]form-data 提交数据拿不到入参

2025-11-04 400 views
5
 header:
      { 'content-type':
         'multipart/form-data; boundary=--------------------------237608247632424222274525',
        'cache-control': 'no-cache',
        'postman-token': '6b9f892e-2036-4003-9697-503a1deef148',
        'user-agent': 'PostmanRuntime/7.6.0',
        accept: '*/*',
        host: '127.0.0.1:7003',
        cookie: 'locale=en-us; csrfToken=wNQkSw8HdK6x7qjuAl36Fvlt',
        'accept-encoding': 'gzip, deflate',
        'content-length': '163',
        connection: 'keep-alive' } },

一个这样的请求

ctx.body 
是空的很奇怪。
我用 potman 请求过来的,选择的 form-data, 且删除了 header 

回答

5

ctx.request.body

6

@atian25 也是空的对象

ctx.request.body --  {}

但是我用 raw json的方式请求可以拿到参数

7

最小可复现方式或者自己 debug 下,可能是 content type

8

@atian25

    config.security = {
        csrf: {
            enable: false,
        }
    };

这个配置会影响么

7

@buzai 请确保配置了 file 模式 https://eggjs.org/zh-cn/basics/controller.html#%E8%8E%B7%E5%8F%96%E4%B8%8A%E4%BC%A0%E7%9A%84%E6%96%87%E4%BB%B6

8
ctx.request.body 无法正常拿到数据,是因为egg.js 内置了bodyparser插件,而这个插件是不支持form-data编码数据的 所以这个插件本身有问题,要解决这个问题,要么使用x-www-form-urlencoded 发起请求,要么就换成支持form-data的插件,比如koa-body
7

ctx.request.body 无法正常拿到数据,是因为egg.js 内置了bodyparser插件,而这个插件是不支持form-data编码数据的

@chobits4 这个结论是不对的。

5

@atian25 我研究了感觉也是这个。。。原因

8

@buzai 提供最小可复现仓库吧

5

@atian25

https://github.com/buzai/test-egg.git

里面有 postman api 描述

9

@buzai

bodyparser 默认支持的是 x-www-form-urlencodedjson form-data 是通过 https://github.com/eggjs/egg-multipart 来支持的

因为 form-data 一般是文件上传场景,如果每个请求都去解析的话,容易被攻击。

建议:

把 form 的 type 改为 x-www-form-urlencoded 如果坚持要 form-data 的话,如下:
    config.multipart = {
        // 仅对指定的 URL 进行解析
        fileModeMatch: /^\/file\/.*/,
    };
8

@atian25 懂了多谢?

4

更简单的方法,配置一下bodyParser,增加对这种content-type支持就可以了

  config.bodyParser = {
    extendTypes: {
      form: ['multipart/form-data']
    }
  };
3

@jaggerdeng 看我 https://github.com/eggjs/egg/issues/3708#issuecomment-501603429 的描述

0

更简单的方法,配置一下bodyParser,增加对这种content-type支持就可以了

  config.bodyParser = {
    extendTypes: {
      form: ['multipart/form-data']
    }
  };

这种方式取到是未解析的数据,使用multipart https://github.com/eggjs/egg/issues/3708#issuecomment-501603429 是最好的方法