Node JS body-parser获取rawBody和body

时间:2017-04-27 11:47:34

标签: node.js body-parser

我目前正在以下面提到的方式实现身体解析器

 var rawBodySaver = function (req, res, buf, encoding) {
        if (buf && buf.length) {
            req.rawBody = buf.toString(encoding || 'utf8');
        }
    }
    app.use(bodyParser.urlencoded({ extended: true}))
    app.use(bodyParser.json({ verify: rawBodySaver }));
    app.use(bodyParser.urlencoded({ verify: rawBodySaver, extended: true }));
    app.use(bodyParser.raw({ verify: rawBodySaver, type: function () { return true } }));

以前,它只是app.use(bodyParser.urlencoded({ extended: true})),我在req.body中获取了数据。

但是由于一些新的要求我不得不使用rawBody。有什么方法可以在rawBodybody

中以各自的格式获取数据

目前,只有rawBodybody有效。两个人都不能一起工作。

1 个答案:

答案 0 :(得分:4)

虽然有点hacky,但我喜欢你使用verify函数将原始体存储在某处的想法。我相信你的问题是由被叫bodyParser.*太多次造成的。似乎只有最后一次通话才能发挥作用。

const express = require('express')
const app = express()
const bodyParser = require('body-parser')

function rawBodySaver (req, res, buf, encoding) {
  if (buf && buf.length) {
    req.rawBody = buf.toString(encoding || 'utf8')
  }
}

app.use(bodyParser.urlencoded({
  extended: true,
  verify: rawBodySaver
}))

app.post('/', function (req, res, next) {
  console.log(`rawBody: ${req.rawBody}`)
  console.log(`parsed Body: ${JSON.stringify(req.body)}`)
  res.sendStatus(200)
})

// This is just to test the above code.
const request = require('supertest')
request(app)
.post('/')
.set('Content-Type', 'application/x-www-form-urlencoded')
.send('user=tobi')
.expect(200, () => {})

打印:

rawBody: user=tobi
parsed Body: {"user":"tobi"}