【问题标题】:Node and Express - defining app.get a second time does not overwrite first definitionNode 和 Express - 第二次定义 app.get 不会覆盖第一次定义
【发布时间】:2020-08-12 14:04:49
【问题描述】:

我想了解 Express 中间件在特定条件下的工作原理。如果同时定义以下两条路径(同名):

app.get('/test', function(req, res){
    res.send ('A response...');
});

app.get('/test', function(req, res){
    res.send ('Another response...');
});

/test 的调用只会返回“A response...”,而不是第二个响应的文本。我原本理解body会被看成一个中间件函数,依次执行。因为/test 已经有一个定义,所以根本没有加载第二个定义是否正确?

或者,有没有办法在侦听时删除第一个定义,然后添加第二个定义 - 而无需重新启动节点会话?

【问题讨论】:

  • 第一个匹配的路由被执行,另一个被忽略在这里查看答案:stackoverflow.com/questions/32603818/…“或者,有没有办法在监听时删除第一个定义,并添加“不是我知道

标签: node.js express middleware


【解决方案1】:

首先,让我来说明一下发生的情况。

所有端点的路由处理程序都存储在一个全局数组中。 Express.js 递归遍历并调用所有处理程序,直到找到正确的路由处理程序。

全局数组不是此用例的理想数据结构。尚不清楚为什么 Express.js 选择不使用诸如地图之类的恒定时间数据结构来存储其处理程序。每个请求都需要在路由数组中进行昂贵的 O(n) 查找才能找到其路由处理程序

Express.js 甚至允许您为一个路由设置许多相同的路由处理程序。你可以在不知不觉中设置这样的请求链。

[a, b, c, c, c, c, d, e, f, g, h]

对路由 c 的请求将在第一次出现 c 处理程序时终止(数组中的位置 2)。但是,对 d 的请求只会在数组中的位置 6 处终止,从而在 a、b 和 c 的多个实例中花费了不必要的时间。从而导致每个处理程序被调用时延迟增加。

如果一个路由有多个路由处理程序链,Express.js 会抛出一个错误。在这一点上,主要假设是处理程序数组的大小随着时间的推移而增加,从而导致每个处理程序被调用时延迟的增加。很可能在我们的代码中某处存在处理程序泄漏,可能是由于处理程序重复问题。

使用类似的路由会影响服务器的全局性能。

现在,如果您打算使用同一路线实现不同的目的,您可以在其中一条路线中定义参数并删除另一条路线,如下所示:-

app.get('/test/:type', function(req, res){
    if(req.params['type'] == 'A')
    res.send ('A response...');
    else
    res.send ('Another response...');
});

从前端发出的示例调用:-

{{yourAPIServer}}/test/A
Response should be: A response...

使用查询参数也可以实现相同的行为。

app.get('/test', function(req, res){
    if(req.query['type'] == 'A')
    res.send ('A response...');
    else
    res.send ('Another response...');
});

从前端发出的示例调用:-

{{yourAPIServer}}/test?type=B
Response should be: Another response...

我试图让你理解大部分可能的事情。

【讨论】:

  • 感谢 Abhijeet 提供的好信息。您说“所有端点的路由处理程序都存储在一个全局数组中。”你知道这个全局数组的名字吗?
  • 等等!去看看这个博客,它会通过展示一些内部快速代码给你更多的见解,这些代码对每条路线都使用了层对象之类的东西。 sohamkamani.com/blog/2018/05/30/…
猜你喜欢
  • 1970-01-01
  • 2019-12-15
  • 2014-05-02
  • 1970-01-01
  • 2023-01-14
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多