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

hrd*_*rbl 5 debugging middleware node.js express

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

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

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

Ada*_*son 7

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

在快车4中:

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

// Routes registered on a router object
router.stack
Run Code Online (Sandbox Code Playgroud)

对于检查/调试来说很好,但针对任何以下划线开头的变量进行编程可能不是一个好主意。


Kop*_*lyf 6

中间件的工作原理:

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

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

例子,

app.use(compression());
app.use(passport.initialize());
app.use(bodyParser());
app.use(cookieParser());
Run Code Online (Sandbox Code Playgroud)

顺序是

  1. 压缩,
  2. 护照,
  3. 正文解析器,
  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());
Run Code Online (Sandbox Code Playgroud)

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

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

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