egg.js 如何获取request.body?

最近打算使用egg.js做一个持续部署的工具,需要用到webhook,但是在校验的过程中,官方给了一个demo,是用express做的就可以通过验证,egg.js就无法通过验证,
官方demo如下

const express = require('express');
const bodyParser = require('body-parser');
const crypto = require('crypto');

const app = express();
app.use(bodyParser.text({ type: '*/*' }));
// ...

我找到了两个差别在于里面有一个字段

使用express的body-parser获取到的是:

"html_url":"\u003ca href\u003d\u0027https://coding.net/u/TEST/p/game_hr\u0027 target\u003d\u0027_blank\u0027\u003egame_hr\u003c/a\u003e"

使用egg获取到的是:

"html_url":"<a href='https://coding.net/u/TEST/p/game_hr' target='_blank'>game_hr</a>"

请问egg.js如何获取express那样的格式?

阅读 7.9k
1 个回答

egg.js 用ctx.request.rawBody(没有解析过的body,字符串类型)获取body值,不用ctx.request.body, 等同于express里的req.body(配置是bodyParser.text({ type: '*/*' }))

以下是分析历程:

\unnnn 十六进制代码 nnnn 表示的 Unicode 字符( n 是 0 到 F 中的一个十六进制数字)

\u这个是Unicode转义字符。上面两段用字符串表示在js里是相等的。如图:

clipboard.png

既然说是不一样的,那就怀疑你取的内容是不是转义过的(即'\\u003c' 在控制台输出后显示的是 \u003c

所以有一点要你自己明确 “使用express的body-parser获取到的是:...” 这里你是怎么获取的,以下我写的案例,同一个body我可以展现出三个不一样的输出:
案例代码:

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.text({ type: '*/*' }));
const port = 3000

app.post('/', (req, res) => {
  console.log(1, req.body)
  console.log(req.body)
  console.log(JSON.parse(req.body))
  res.send(req.body)
})

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

postman 测试接口
image.png

输出:

image.png

个人猜测:你express取的是第二种结果,egg.js你取的是第三种结果(egg.js 自动会将body转为json对象,即typeof ctx.request.body === object)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题