【问题标题】:How can I inspect the set of Express.js middleware that is being used?如何检查正在使用的 Express.js 中间件集?
【发布时间】:2015-05-22 18:27:15
【问题描述】:

背景故事:我正在尝试调试一个中间件中的问题,我认为该问题来自另一部分。但是,我不确定。所以无论如何,我希望能够检查实际调用了什么中间件,因为我不确定顺序。

是否可以检查当前正在使用的中间件集?

我试图找到 Express 可能存储中间件的任何内部状态,但我找不到。

【问题讨论】:

  • 能否详细说明问题,提供一些代码供我们查看
  • 非常通用的东西,比如:``` var app = require('express'); app.use(压缩()); app.use(passport.initialize()); app.use(bodyParser()); app.use(cookieParser()); ```等
  • 我认为您的问题可能是由于中间件的顺序,意味着 bodyParser/cookieParser 通常是第一个,我们调用,因为我们需要尽快修改请求。我也给出了详尽的答案,以便您了解它是否适​​合您。这就是我调试中间件问题的方式:)

标签: node.js debugging express middleware


【解决方案1】:

中间件的工作原理:

中间件通常用于在请求或响应对象到达其他中间件之前对其进行转换。

如果您关心中间件的调用顺序,express 会按照定义的顺序调用中间件。

例子,

app.use(compression());
app.use(passport.initialize());
app.use(bodyParser());
app.use(cookieParser());

顺序是

  1. 压缩,
  2. 护照,
  3. bodyParser,
  4. cookie解析器

(另外我认为你的 bodyParser 和 cookieParser 中间件应该在其他中间件之前,比如护照)。

这就是为什么最后保留错误处理中间件的原因,这样如果它到达它们,它们就会给出错误响应。

所以基本上,请求会滴落到中间件,直到其中一个说它不希望它继续下去(get,post 方法就是这样的中间件,会停止请求)。

现在,调试部分

您可能无法在内部正确检查中间件,但您可以通过在中间插入自己的自定义中间件然后在其上放置断点来检查中间件是否正常工作。

假设您想要在 bodyParser 中间件完成任务后调试您的请求发生了什么,您可以将自定义中间件放在两者之间并检查请求和响应是否正确修改。 你如何做到这一点是通过下面的例子。

例子,

app.use(bodyParser());

//custom middleware to inspect which middleware is not  working properly
app.use(function(req,res,next){
   console.log("check something!"); //do something here/put a breakpoint
   next(); 
   /*this function is the third parameter 
   and need to be called by the middleware 
   to proceed the request to the  next middleware,
   if your don't write this line, your reqest will just stop here.
   app.get/app.post like methods does not call next*/
});

app.use(cookieParser());

这是您在中间件之间移动此自定义调试器的一种方法,直到您找出哪个提供了错误的输出。

另外,如果您想检查中间件的功能,您可以查看这些中间件的文档。他们非常好。

通过使用您的自定义中间件进行检查。

【讨论】:

  • 感谢您的彻底回复。对我来说,其中一个问题是我们最终得到了很多中间件,其中一些是有条件添加的,而不是全部添加到同一个地方。 app 对象在各处传递,因此很难单步执行。我无法很好地了解正在运行的内容,因为代码是如此杂乱无章!我应该在我的问题中提到这一点,但我的问题的理想解决方案类似于命令 rake middleware 为 Ruby on Rails tinyurl.com/pyjt6vv 执行的操作
【解决方案2】:

您看不到具体是什么“中间件”,但您可以检查所有已注册的处理程序。

快递4:

// Routes registered on app object
app._router.stack

// Routes registered on a router object
router.stack

适合检查/调试,可能不是针对以下划线开头的任何变量进行编程的好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    相关资源
    最近更新 更多