一条路线上的 Nodejs bodyParser.raw

Nodejs bodyParser.raw on one route

我的 index.js 中有以下内容:

app.use(bodyParser.json());

但是 Stripe webhooks 想要这个:

Match the raw body to content type application/json

如果我将 index.js 更改为以下内容:

app.use(bodyParser.raw({type: 'application/json'}));

它工作正常。但是我所有其他 API 路线将不再有效。这是我的路线:

router.route('/stripe-events')
  .post(odoraCtrl.stripeEvents)

如何只为这条 api 路线更改为裸体?

将它们分成'/api'和'/stripe-events'两个路由器,并仅在第一个路由器上注明bodyParser.json()

stripeEvents.js

const express = require('express')
const router = express.Router()
...
router.route('/stripe-events')
  .post(odoraCtrl.stripeEvents)
module.exports = router

api.js

const express = require('express')
const router = express.Router()
...
router.route('/resource1')
  .post(addResource1)
router.route('/resource2')
  .post(addResource2)
module.exports = router
const stripeEventsRouter = require('./routers/stripeEvents';
const apiRouter = require('./routers/api';

apiRouter.use(bodyParser.json());
stripeEventsRouter.use(bodyParser.raw({type: 'application/json'}));
app.use('/api', stripeEventsRouter);
app.use('/api', apiRouter);

您可以通过这样做同时访问两者:

app.use(bodyParser.json({
  verify: (req, res, buf) => {
    req.rawBody = buf
  }
}))

现在可以在 req.rawBody 上获得原始正文,并且可以在 req.body[ 上获得 JSON 解析数据.