NodeJS 回调:跟踪数据库调用,以便我可以终止进程

Posted

技术标签:

【中文标题】NodeJS 回调:跟踪数据库调用,以便我可以终止进程【英文标题】:NodeJS callbacks: tracking db calls so I can terminate the process 【发布时间】:2014-01-27 11:18:12 【问题描述】:

这个月我收到了 Heroku 的账单,这让我很吃惊。幸运的是,它只有几美元,但我没想到我的使用率这么高。我检查了账单,上面说我上个月用了大约 1000 小时。我有点困惑,因为我的应用程序每小时只运行几秒钟以发送一些电子邮件,但后来我意识到这个过程并没有终止。

在注释掉我的大量代码后,我确定该进程不会退出,因为我的 mongoose 数据库连接仍处于打开状态。但是我有几个嵌套回调到数据库,然后到 mailgun 以发送这些电子邮件,有时 mailgun 回调有自己的 mailgun 回调。如何跟踪这些并确保最后关闭数据库?

【问题讨论】:

【参考方案1】:

我问了我的 JS 忍者朋友,他说用semaphores。这听起来令人生畏,但实际上非常容易。

npm install semaphore --save

包裹页面here。然后,对于我的每个数据库调用,我都这样做了:

sem.take(function () 
  Object.find(key: value, function () 
    sem.leave(); // (I don't need the database anymore)
    // tons of other code
  );
);

然后我确保所有代码在此之前运行:

sem.take(function () 
  sem.leave();
  db.close();
);

我想我可能可以对正在发生的事情进行更深入的了解,但这目前正在奏效。

【讨论】:

以上是关于NodeJS 回调:跟踪数据库调用,以便我可以终止进程的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS 异步回调未完成和渲染把手模板

nodejs中的回调与直接调用函数

nodejs异步回调函数中this问题,求助

node.js 可以编写一个方法,以便可以两种方式调用它 - 即使用回调或异步/等待?

async.map 不会在 nodejs 中调用回调

异步回调/我们为什么要使用NodeJS