[eggjs/egg]发现一个bug,接受不到post接口的请求体

2024-06-28 640 views
9

eggjs定义了一个post接口,eggjs默认的格式是application/json把? 在调用的时候发现this.ctx.request.body, 有时候能接受到传过来的json参数, 有时候是空对象,区别在于

  • 比如说使用postman调试接口的时候,选择json格式的,postman会自动添加请求头Content-Type:application/json。能看到this.cxt.request.body是传入的参数对象
  • 但是偶然发现总是接收不到别人传过来的参数, 一模一样的调用方式,只不过人家是通过代码调用我的接口。后来发现他请求方式是Content-Type: application/json;charset=utf-8;

image

就是因为多了个charset=utf-8; 导致ctx.request.body输出为空对象,这咋搞啊

或者说怎么改这个东西?

可复现问题的仓库地址(Reproduction Repo)

Node 版本号:

v14.20.0

Eggjs 版本号:

3.16.0

相关插件名称与版本号(PlugIn and Name):

操作平台与版本号(Platform and Version):

centos7

回答

2

@lovelyJason 确实有问题,会尽快修复

6

这个问题使我不得不放弃eggjs。现在是能复现的吧,我很清楚的能看到是有问题存在的

6

@lovelyJason Content-Type最后多了个分号导致的,application/json;charset=utf-8;是有问题的,去掉分号application/json;charset=utf-8 就好了

9

呃,我再加一个测试用例,如果是这个问题,我们会兼容一下。

2

啊,这个 content-type 的解析不是基础类库么,koa 和 express 体系应该都用同一个吧?如果有问题应该全都挂了感觉。

6

好像是哈哈

5

是结尾多了个分号的原因,http请求头结尾不应该有分号;

说句题外话,另外这些基础库全都是依赖的body-parser;eggjs依赖的co-body。 比如express只支持三种请求格式,application/x-www-urlencoded, application/json, multipart/form-data。如果想传递比如说plain的文本, 是不支持的。body-parser包括co-body都不支持一些另类的JSON。在JSON5标准里,key是可以不用带双引号的,现在有些人接口就是这么干的,不传双引号给人家,nodejs里这些web框架会全局报错。只能进去body-parser包里面hack; var JSON5 = require('json5'); JSON.parse改成JSON5.parse...???

5

media-typer 没有兼容这个格式

TypeError: invalid parameter format
    at Object.parse (/Users/fengmk2/git/github.com/koajs/bodyparser/node_modules/.store/media-typer@0.3.0/node_modules/media-typer/index.js:186:11)
    at normalizeType (/Users/fengmk2/git/github.com/koajs/bodyparser/node_modules/.store/type-is@1.6.18/node_modules/type-is/index.js:240:20)
    at tryNormalizeType (/Users/fengmk2/git/github.com/koajs/bodyparser/node_modules/.store/type-is@1.6.18/node_modules/type-is/index.js:263:12)
    at typeis (/Users/fengmk2/git/github.com/koajs/bodyparser/node_modules/.store/type-is@1.6.18/node_modules/type-is/index.js:48:13)
    at typeofrequest (/Users/fengmk2/git/github.com/koajs/bodyparser/node_modules/.store/type-is@1.6.18/node_modules/type-is/index.js:143:10)
    at Object.is (/Users/fengmk2/git/github.com/koajs/bodyparser/node_modules/.store/koa@2.14.2/node_modules/koa/lib/request.js:638:12)
    at parseBody (/Users/fengmk2/git/github.com/koajs/bodyparser/index.js:97:55)
    at bodyParser (/Users/fengmk2/git/github.com/koajs/bodyparser/index.js:80:25)
    at dispatch (/Users/fengmk2/git/github.com/koajs/bodyparser/node_modules/.store/koa-compose@4.1.0/node_modules/koa-compose/index.js:42:32)
    at /Users/fengmk2/git/github.com/koajs/bodyparser/node_modules/.store/koa-compose@4.1.0/node_modules/koa-compose/index.js:34:12
    at Application.handleRequest (/Users/fengmk2/git/github.com/koajs/bodyparser/node_modules/.store/koa@2.14.2/node_modules/koa/lib/application.js:186:12)
    at Server.handleRequest (/Users/fengmk2/git/github.com/koajs/bodyparser/node_modules/.store/koa@2.14.2/node_modules/koa/lib/application.js:157:21)
    at Server.emit (node:events:513:28)
    at parserOnIncoming (node:_http_server:1091:12)
    at HTTPParser.parserOnHeadersComplete (node:_http_common:119:17) application/json;charset=utf-8;
3

这个可以提需求的,增加 JSON5 parse。

6

这种不规范的方式,你放弃 egg 用其他框架也一样会遇到。 能兼容就尽量,但不能一味的兼容。

9

@lovelyJason 重新安装依赖就可以修复了。