Промежуточное ПО Koa прерывает поток выполнения и возвращает ошибку BadRequest [ERRCONNABORTED] - PullRequest
0 голосов
/ 04 сентября 2018

Я определил свое пользовательское промежуточное ПО, как показано ниже. Он в основном выбирает параметры формы в формате urlencoded и устанавливает строку urlencoded в заголовки для последующего использования. Мне пришлось пойти по этому пути, потому что для запросов типа application/x-www-form-urlencoded только koa-bodyparser поддерживает получение необработанной строки в кодировке urlencoded с параметрами формы. Однако я не могу использовать его из-за того, что он не поддерживает файлы. Мое промежуточное программное обеспечение определено ниже:

const rawBody = require('raw-body')
const contentType = require('content-type')

function rawUrlEncodedFormData() {
  return async function setUrlEncodedHeader(ctx, next) {
    if (ctx.path === '/v1/urlencoded') {
      const rawRequestBody = await rawBody(ctx.req, {
        length: ctx.get('content-length'),
        encoding: contentType.parse(ctx.req).parameters.charset,
      })
      const urlEncodedString = rawRequestBody.toString('utf-8')
      console.log('form urlencoded params:', urlEncodedString)
      ctx.set('urlencoded-form-string', urlEncodedString)
      await next()
    }
    await next()
  }
}

module.exports = rawUrlEncodedFormData

Затем я использую его вместе с другими промежуточными программами, такими как:

const middlewares = () =>
  koaCompose([
    Cors(),
    requestId(),
    logger(log),
    responseTime({
      logger: log,
    }),
    rawUrlEncodedFormData(),
    koaBody({
      multipart: true,
    }),
    redis({
      redisURL: config.redis.url,
    }),
    authorize(),
  ])

module.exports = middlewares

Однако, когда я выполняю вызов этой конечной точки: 1. Строка параметров формы urlencoded выбрана правильно. 2. Запрос (и приложение) просто зависает после

Есть что-то, чего мне не хватает? Функция контроллера, зарегистрированная для этого маршрута, вообще не вызывается. Вместо этого я получаю следующую ошибку

«запрос прерван», «имя»: «BadRequestError», «стек»: «BadRequestError: запрос прерван \ n на IncomingMessage.onAborted

1 Ответ

0 голосов
/ 06 сентября 2018

В вашем коде есть путь, который выполняется await next() два раза. Рассмотрите возможность рефакторинга следующим образом:

const rawBody = require('raw-body')
const contentType = require('content-type')

function rawUrlEncodedFormData() {
  return async function setUrlEncodedHeader(ctx, next) {
    if (ctx.path === '/v1/urlencoded') {
      const rawRequestBody = await rawBody(ctx.req, {
        length: ctx.get('content-length'),
        encoding: contentType.parse(ctx.req).parameters.charset,
      })
      const urlEncodedString = rawRequestBody.toString('utf-8')
      console.log('form urlencoded params:', urlEncodedString)
      ctx.set('urlencoded-form-string', urlEncodedString)
    }
    await next()
  }
}

module.exports = rawUrlEncodedFormData
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...