我已经定义了我的自定义中间件,如下所示。它基本上获取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
答案 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