当前位置: 首页 > 知识库问答 >
问题:

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

冉绯辞
2023-03-14

所以,我在这个快速的应用程序中工作,所有路线都有有限的身体大小,除非你是管理员,因为管理员需要几个路线的无限身体大小。我有限制的身体大小中间件,我这样使用它:app.use(middleware.limit身体大小)

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

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();
      });
    });
  }
}

我怎么能解决这个问题,只有一个中间件,而不是通过传递身体解析器中间件到每一个路由或路由器分开。

共有1个答案

唐恺
2023-03-14

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

您也没有检查错误;您的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参数将任何错误传递给express framework。然后()

使用ECMAScript 2017的asyncawait语法,您可以使其更易于阅读:

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)
  }
}
 类似资料:
  • 我有一个后api,有对象,但我不能打印在控制台上它的下载未定义我以为我错过了身体解析器,但添加身体解析器后,我看到错误身体解析器弃用身体解析器:使用个人json/urlencoded middlewares将不胜感激。 路线。js 应用程序。js

  • 上一小节,我们讲了如何定义主题,定义之后,你要决定使用哪个主题。DispatcherServlet会查找一个名称为themeResolver的bean以确定使用哪个ThemeResolver的实现。主题解析器的工作原理与地区解析器LocaleResolver的工作原理大同小异。它会检测,对于一个请求来说,应该使用哪个主题,同时它也可以修改一个请求所应应用的主题。Spring提供了下列的这些主题解析

  • Im使用路由器类管理我的所有路由: 我想检查x-www-form-urlencoded主体参数。以查看键是否不是它应该是的,或者值是否为空。 我编写了一个中间件函数来检查: 但它似乎不喜欢我将参数传递给中的中间件函数 我的问题是,我如何创建一个中间件函数,它接受比req、res和next更多的值?以及如何在路由器实例中正确使用此功能。 欢迎任何反馈

  • 问题内容: 我正在尝试将包含(自然语言)时间的字符串解析为 hh:mm 时间对象?例如: 我已经研究了Ruby的Chronic和Java的Natty(以及其他一些库),但是它们似乎都专注于解析日期。诸如“十点五”之类的字符串均无法正确解析。 有人知道适合我需要的图书馆吗?还是应该开始使用自己的解析器? 问题答案: 我不想延长parsedatetime,因此我决定使用pyPEG(Python的解析器