Body parser использует промежуточное ПО bodyParser из другого промежуточного ПО

Я использовал его в режиме реального времени. Обычно мы не хотим выполнять любое динамическое распределение (или освобождение) после запуска системы, потому что нет никакой гарантии, сколько времени это займет.

То, что я могу сделать, это предустановить большой кусок памяти (достаточно большой, чтобы удержать любое количество того, что может потребоваться классу). Затем, когда я выясню во время выполнения, как построить вещи, размещение new можно использовать для построения объектов прямо там, где я их хочу. Одна из ситуаций, которые я знаю, я использовал, чтобы помочь создать гетерогенный круговой буфер .

Это, конечно, не для слабонервных, но именно поэтому они делают для него синтаксис угловатый.

0
задан Yannick Loriot 16 January 2019 в 22:57
поделиться

1 ответ

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

Вы также не проверяете ошибки; Возможно, ваше промежуточное ПО bodyParser выдает ошибку анонимным обратным вызовам, которые вы передали им в качестве параметра next, поэтому обрабатывайте ошибки правильно. Один из самых простых способов сделать это - пообещать каждому промежуточному программному обеспечению использование модуля util , поскольку вы все равно уже связываете его.

Я подозреваю, что вашим телом запроса может быть JSON, а промежуточное ПО urlencoded пытается его проанализировать безуспешно. В этот момент bodyParser израсходовал поток тела, поэтому промежуточное ПО json, вероятно, также выйдет из строя. Поскольку вы игнорируете обе ошибки, вы не будете знать наверняка, какое будет следующее исправление, пока не попробуете это:

const { promisify } = require('util')
const json = promisify(bodyParser.json())
const limitedJson = promisify(bodyParser.json({ limit: '1kb' }))
const urlencoded = promisify(bodyParser.urlencoded({ extended: false }))
const limitedUrlencoded = promisify(bodyParser.urlencoded({ extended: false, limit: '1kb' }))

...

limitBodySize: (req, res, next) => {
  ...

  if (admin) {
    urlencoded(req, res).then(
      () => json(req, res)
    ).then(
      () => next(),
      next
    )
  } else {
    limitedUrlencoded(req, res).then(
      () => limitedJson(req, res)
    ).then(
      () => next(),
      next
    )
  }
}

Это передаст любые ошибки в каркас экспресса, используя параметр onRejected .then()

Используя синтаксис ECMAScript 2017 async и await, вы можете сделать его немного проще для чтения:

limitBodySize: async (req, res, next) => {
  ...

  try {
    if (admin) {
      await urlencoded(req, res)
      await json(req, res)
    } else {
      await limitedUrlencoded(req, res)
      await limitedJson(req, res)
    }

    next()
  } catch (error) {
    // if error occurs here, you probably need to figure out what your next issue is
    next(error)
  }
}
0
ответ дан Patrick Roberts 16 January 2019 в 22:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: