如何检查正在使用的 Express.js 中间件集?

How can I inspect the set of Express.js middleware that is being used?

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

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

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

你看不到具体是什么"middleware",但你可以检查所有已注册的处理程序。

在快递 4 中:

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

// Routes registered on a router object
router.stack

对于 inspection/debugging 很好,针对任何以下划线开头的变量进行编程可能不是一个好主意。

中间件的工作原理:

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

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

示例,

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

顺序是

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

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

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

所以基本上,请求会沿着中间件向下滴落,直到其中一个说它不希望它继续前进(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());

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

此外,如果你想检查中间件的功能,你可以查看那些中间件的文档。他们很好。

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