猫鼬中间件禁用(/取消挂钩/删除/删除)创建的挂钩

时间:2018-07-09 17:20:48

标签: node.js mongodb express mongoose

在快速/猫鼬服务器应用程序中,我想接收一个请求,然后将状态更改为可以接收另一种类型的请求的状态,并且当第二个请求成功完成时,我想响应第一个请求。


我实现此方法的方法是在MongoDB中使用一个占位符文档,并在收到第一个请求时设置一个mongoose post save钩子。这个异步中间件是一个闭包,其中包含对第一个请求的响应的引用。

第二个请求使用来自另一个远程客户端的新信息来修改此占位符文档。保存后,将运行后保存钩子,该钩子将确定该文件是否正确,并通过第一个请求验证更改。如果通过,则发送第一个响应。否则,挂钩将继续等待正确的更改,并检查该模式上发生的所有保存。

我的问题是,即使在发生了正确且可接受的更改并将响应返回给第一个客户端之后,(shell)保存后的钩子仍然保留。现在,看到响应已成功发送后,它的确会立即返回,但是令我感到困扰的是它仍然存在,并被要求进行所有保存。

这是一个应在其生命周期内运行的预期请求为1k-10k的应用程序。因此,除非定期重新启动应用程序,否则所有保存后挂钩的调用都可能会大大降低速度。


现在,进入以下问题:

  1. 是否有更好/更容易/更直接的架构来解决此问题?
  2. 如果没有,我应该为此用例担心所有的shell后保存钩子吗?
  3. 如果是,如何删除一个怪胎钩

由于存在“删除”钩子,因此这种事情比平时更令人生气。实际上,所有搜索引擎都无法向我指出禁用/删除/取消连接/删除中间件功能。文档中也没有。


我能想到的最好的方法是使用一个单参数中间件函数,然后用{}或undefined(或另一个闭包函数,如果遇到另一个request-type-1)覆盖该函数。这是唯一的解决方案吗?这样,我就失去了做出和保留多个request-type-1的响应的能力。

1 个答案:

答案 0 :(得分:0)

找到了两种方法,一种是从this answer中删除模式调用队列中的特定条目。

编辑:从5.1.5版本开始,以下内容不适用于Mongoose-未定义removePost。

细读codebase used来实现钩子时,发现了另一个(更好)。

您可以使用来删除post

Document.post('set', someFn); // Setting it
Document.removePost('set', someFn); // Removing it