Koa中间件中断执行流程,返回BadRequest错误[ERRCONNABORTED]

时间:2018-09-04 16:50:38

标签: javascript middleware koa koa-bodyparser

我已经定义了我的自定义中间件,如下所示。它基本上获取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 :(得分:0)

您的代码中有一条路径执行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