Express 用于Expres.js检查请求正文的不引人注目的中间件

Express 用于Expres.js检查请求正文的不引人注目的中间件,express,body-parser,Express,Body Parser,是否存在第三方中间件或为Express.js创建此类中间件的方法,该中间件允许拦截所有请求并检查请求的正文内容,而不会影响后续中间件(例如)或路由可能依赖原始正文(例如)的端点 据我所知,bodyParser本身的工作方式似乎有些突兀,不允许路由覆盖默认的解析行为。express文档描述了中间件(如bodyParser)是如何填写的。bodyParser的这种行为从简单性和性能的角度来看是有意义的,但这并不能使它成为创建需要检查请求内容并让应用程序的其余部分在不修改的情况下工作的中间件的理想选择

是否存在第三方中间件或为Express.js创建此类中间件的方法,该中间件允许拦截所有请求并检查请求的正文内容,而不会影响后续中间件(例如)或路由可能依赖原始正文(例如)的端点

据我所知,bodyParser本身的工作方式似乎有些突兀,不允许路由覆盖默认的解析行为。express文档描述了中间件(如bodyParser)是如何填写的。bodyParser的这种行为从简单性和性能的角度来看是有意义的,但这并不能使它成为创建需要检查请求内容并让应用程序的其余部分在不修改的情况下工作的中间件的理想选择。这一点尤其正确,因为根据解析中间件的不同,结果的格式可能完全不同。经过一番挖掘之后,我想知道是否通常可以使用express来实现这一点,或者,一旦您阅读了请求正文,您就不再能够使用其他中间件,例如bodyParser或express http proxy,它们希望直接访问正文

可能相关:

您可以始终使用包含express中间件的软件包,如下所示:

var getRawBody = require('raw-body');
var typer = require('media-typer');

app.use(function (req, res, next) {
  getRawBody(req, {
    length: req.headers['content-length'],
    limit: '1mb',
    encoding: typer.parse(req.headers['content-type']).parameters.charset
  }, function (err, string) {
    if (err) return next(err)
    req.text = string
    next()
  })
})
如果您唯一关心的是性能,我就不会太担心主体解析器,因为它不太可能对性能产生巨大影响。如果可以的话,我建议您只需将主体解析器与典型的express中间件
应用程序一起使用。使用(…)
检查请求主体。

您可以将该包与express中间件一起使用,如下所示:

var getRawBody = require('raw-body');
var typer = require('media-typer');

app.use(function (req, res, next) {
  getRawBody(req, {
    length: req.headers['content-length'],
    limit: '1mb',
    encoding: typer.parse(req.headers['content-type']).parameters.charset
  }, function (err, string) {
    if (err) return next(err)
    req.text = string
    next()
  })
})

如果您唯一关心的是性能,我就不会太担心主体解析器,因为它不太可能对性能产生巨大影响。如果可以,我建议您将主体解析器与典型的express中间件
app一起使用。使用(..)
检查请求主体。

主体解析器的主要问题是后续的显式中间件声明,例如
app.use('api/*',bodyParser.json(),function(req,res,next){…})
将中断,因为如果之前的bodyParser中间件已经以不同的格式(例如text、raw、urlencode等)解析了主体,那么req.body此时将不是json。我尝试了发布的原始主体模块,但不幸的是,它似乎中断了express http proxy。我不确定我是否能对此做些什么。你建议起诉raw body,这让我想到了我的确切问题。还有一种方法可以改变express http proxy以适应突兀的中间件。很好,您知道不兼容的地方,如果需要,您可以随时复制建议的pull请求。是的,而且有点脱离主题,bodyParser之类的工具可以修改请求以添加bodyJson等属性,正文。。。而不仅仅是body,让其他中间件猜测对象是什么。此外,如果还不可能的话,节点请求流可能已经以中间件可以用另一个流“替换”的方式被公开,以减少对后续中间件的影响。我仍在消化源代码,看看这是否可能。body parser的主要问题是后续的显式中间件声明,如
app.use('api/*',bodyParser.json(),function(req,res,next){…})
将中断,因为如果之前的bodyParser中间件已经以不同的格式(例如text、raw、urlencode等)解析了主体,那么req.body此时将不是json。我尝试了发布的原始主体模块,但不幸的是,它似乎中断了express http proxy。我不确定我是否能对此做些什么。你建议起诉raw body,这让我想到了我的确切问题。还有一种方法可以改变express http proxy以适应突兀的中间件。很好,您知道不兼容的地方,如果需要,您可以随时复制建议的pull请求。是的,而且有点脱离主题,bodyParser之类的工具可以修改请求以添加bodyJson等属性,正文。。。而不仅仅是body,让其他中间件猜测对象是什么。此外,如果还不可能的话,节点请求流可能已经以中间件可以用另一个流“替换”的方式被公开,以减少对后续中间件的影响。我仍在消化来源,看看这是否可能。