Javascript 主体解析器使用来自另一个中间件的主体解析器中间件

Javascript 主体解析器使用来自另一个中间件的主体解析器中间件,javascript,node.js,express,middleware,body-parser,Javascript,Node.js,Express,Middleware,Body Parser,所以,我正在开发这个express应用程序,其中所有路线的体型都是有限的,除非你是管理员,因为管理员需要几个路线的体型是无限的。我有limitBodySize中间件,我是这样使用的:app.use(middleware.limitBodySize) 但最终我的身体没有被解析,一切都没有定义 limitBodySize: (req, res, next) => { let admin = true; // removed extra steps for simplicity if

所以,我正在开发这个express应用程序,其中所有路线的体型都是有限的,除非你是管理员,因为管理员需要几个路线的体型是无限的。我有limitBodySize中间件,我是这样使用的:
app.use(middleware.limitBodySize)

但最终我的身体没有被解析,一切都没有定义

limitBodySize: (req, res, next) => {
  let admin = true; // removed extra steps for simplicity

  if (admin) {
    bodyParser.urlencoded({ extended: false })(req, res, () => {
      console.log(req.body) // logs undefined
      bodyParser.json()(req, res, () => {
        console.log(req.body) // logs undefined
        next(); // in next route, console.log(req.body) logs undefined
      });
    });
  } else {
    bodyParser.urlencoded({ extended: false, limit: '1kb' })(req, res, () => {
      bodyParser.json({ limit: '1kb' })(req, res, () => {
        next();
      });
    });
  }
}

只有一个中间件,而不是将bodyParser中间件分别传递给每个路由或路由器,我如何解决这个问题。

首先,您应该在自定义条件中间件之外生成
bodyParser
中间件,因为它是可重用的

您也没有检查错误;您的
bodyParser
中间件可能向作为
next
参数传递给它们的匿名回调提供了错误,因此请正确处理错误。实现这一点的最简单的方法之一是使用模块对每个中间件进行说明,因为您已经在链接它们了

我怀疑您的请求主体可能是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
    )
  }
}
这将使用
.then()的
onRejected
参数将任何错误传递给express framework

使用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)
  }
}

我试过你的代码,了解到我面临的一个错误,首先,默认的bodyParser限制是100kb,我的请求超出了这个限制,第二个问题是我发送的文件返回了太多的参数错误,所以我增加了parameterLimit,现在catch没有给出任何错误,但身体是变形的,看起来像这样,知道为什么吗?{'----WebKitFormBoundaryS8lANGAVimhAaXy2\r\n内容配置:表单数据;名称':““名称”\r\n\r\n名称,\r\n----WebKitFormBoundaryS8lANGAVimhAaXy2\r\n内容配置:表单数据;名称=“说明”\r\n\r\n描述,\r\n----WebKitFormBoundaryS8lANGAVimhAaXy2\r\n内容配置:表单数据;名称=“营养信息”\r\n\r\n营养信息,\r\n------WebKitFormBoundaryS8lANGAVimhAaXy2\r\n内容配置:表单数据;name=“price”\r\n\r\n价格\r\n------WebKitFormBoundaryS8lANGAVimhAaXy2-\r\n'},这就是我现在使用的:const json=promisify(bodyParser.json({limit:'100mb');const limitedJson=promisify(bodyParser.json({limit:'1kb'}));const urlencoded=promisify(bodyParser.urlencoded({extended:false,limit:'100mb',parameterLimit:1000000}));const limitedurlencode=promisify(bodyParser.urlencoded({extended:false,limit:'1kb'}));天哪,问题是我正在尝试发送多部分表单,也就是说,我只需要模块来处理多部分表单,这就是为什么你们和我的示例无法工作的原因。。。谢谢你