Почему мне нужно передать (req, res, next) bodyParser в Express? - PullRequest
1 голос
/ 18 марта 2020

Первоначально я использовал bodyParser следующим образом:

app.use(bodyParser.json());

Однако теперь я хочу условно использовать bodyParser:

app.use((req, res, next) => {
    if (req.originalUrl === '/hooks') {
        next();
    } else {
        bodyParser.json()(req, res, next);
    }
});

Когда я пытаюсь удалить (req, res, next), парсер не работает. То есть

app.use((req, res, next) => {
    if (req.originalUrl === '/hooks') {
        next();
    } else {
        bodyParser.json();
    }
});

не работает.

Зачем мне нужно (req, res, next) после bodyParser.json()?

1 Ответ

1 голос
/ 18 марта 2020

https://github.com/expressjs/body-parser/blob/master/index.js#L108

function bodyParser (options) {
  var opts = {}

  // exclude type option
  if (options) {
    for (var prop in options) {
      if (prop !== 'type') {
        opts[prop] = options[prop]
      }
    }
  }

  var _urlencoded = exports.urlencoded(opts)
  var _json = exports.json(opts)

  return function bodyParser (req, res, next) {
    _json(req, res, function (err) {
      if (err) return next(err)
      _urlencoded(req, res, next)
    })
  }
}

Анализатор тела - это промежуточное ПО, которому необходим доступ к res, req и next.

Он анализирует ваш запрос, используя req и in Чтобы передать управление следующему промежуточному программному обеспечению, ему необходим доступ к следующей функции.

Здесь app.use(bodyParser.json()); по умолчанию (req, res, next) передаются как

bodyParser.json(), возвращает return function bodyParser (req, res, next) { .. }

так что становится -> app.use(function bodyParser (req, res, next) { .. });

, но в вашем случае вы сами создаете промежуточное ПО и несете ответственность за передачу параметров в bodyParser, поэтому может иметь доступ к необходимым аргументам.

app.use((req, res, next) => {
    if (req.originalUrl === '/hooks') {
        next();
    } else {
        bodyParser.json()(req, res, next);
    }
});

Посмотрите, как работает app.use ниже

https://github.com/expressjs/express/blob/master/lib/application.js#L187 -L242

...