【问题标题】:How to bypass an express middleware?如何绕过快速中间件?
【发布时间】:2018-05-12 20:45:07
【问题描述】:

我正在处理一个快速应用程序。有一些快速路线,如

 server.get('*' , ... )

等等。它执行一些常见的操作:身份验证、验证...等。

他们还用有意义的信息装饰响应:即在对服务器的每个请求中,它不仅提供预期的 json/html,还提供有关用户的信息、前端使用的一些应用程序元数据等。

假设所有这些额外的元数据都出现在每个对服务器的请求中名为extradata 的字段中。

现在,有一个错误导致了问题:发送这个extradata字段,而不是返回其预期的响应(带有一堆系统日志的json)。

我很确定问题出在其中一个中间件上,因为在这种情况下发送响应的代码非常简单,它只是一个 json 的 res.send()。所以我相信这部分应用程序需要一些模块来设置导致错误的中间件。应用中有很多全局变量和隐式参数,因此很难手动调试。

我试图以编程方式绕过此类中间件,例如:

delete server._router.stack[2];

但导致TypeError: Cannot read property 'route' of undefined 并因此阻止我的应用程序构建:确定这不是要走的路。

那么,有没有办法以编程方式忽略或绕过尚未设置的快速路线

更好的是,有没有办法以编程方式利用快速中间件并记录每个请求和响应

(afaik,有像 morgan 这样的库记录每个请求,但我认为它们不适用于这种情况,因为我需要区分中间件)。

【问题讨论】:

  • 说真的,您需要掌握代码并记录每个中间件,这些中间件被用来让自己成为一个待调查的列表。您不应该试图通过动态进入路由器堆栈并删除中间件处理程序来解决此问题。你应该了解每一个安装的中间件,列出一个可疑的列表,调查每一个,隔离导致问题的那个并修复它,或者将它从你的代码中删除。做一些真正的问题解决和真正的修复,而不是在黑暗中猜测和测试。
  • 仅供参考,app.userouter.use 甚至只是 .use( 的简单递归 grep 应该为您提供所有典型中间件安装的起点。
  • 感谢您的 cmets @jfriend00!问题是,代码库中有很多文件,有server.getserver.useapp.getexpress.use 等等等等等等,我不知道它们是否在这个特定的运行中被调用我的程序-因为几个不同的Web应用程序共享同一个存储库-。此外,由于对全局变量的依赖性很大,仅通过静态查看很难掌握特定文件是否会在应用程序中使用。 我意识到这实际上是一个严重的问题,应该认真解决,但我没有这样的权限。
  • 如果您确实需要在没有中间件功能的情况下进行测试,请在其中使用next()。对于您正在测试的任何请求,都可能带有if 条件。
  • 如果您需要修复如此严重的问题,请获取正确的权限以正确解决问题。软件开发中的一句不幸的说法:“一开始没有足够的时间以正确的方式完成它,但当快速而肮脏的方式不起作用时,总是有足够的时间重新完成它”。以正确的方式解决此问题。有条不紊地理解和分析代码库,找出具体的罪魁祸首。

标签: javascript json node.js http express


【解决方案1】:

我通常做的只是使用下一个方法。您只需将其传递给回调函数即可访问它。比如:

app.use(function(req, res, next) {
  if(...) {
    next();
  } else {
    ...
  }
}

这要做的是转到下一个中间件。

所以如果我理解正确,你可以在 if 语句中检查你到底需要什么,然后做相应的事情。

我建议你阅读 Express API 文档,尤其是关于中间件的部分,你可以找到 here。此外,尝试通过删除问题来隔离嫌疑人并解决问题,而不是删除处理程序并尝试以简单的方式解决问题。

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 2021-01-20
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多