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

时间:2014-01-09 03:38:36

标签: node.js heroku mongoose semaphore

本月我收到了来自Heroku的账单,令我惊讶。幸运的是,它只有几美元,但我并不认为我的使用率如此之高。我检查了账单,它说我上个月用了大约1000个小时。我简单地感到困惑,因为我的应用程序每小时运行几秒钟发送一些电子邮件,但后来我意识到这个过程并没有终止。

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

1 个答案:

答案 0 :(得分: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();
});

我想我可能会对正在发生的事情有更深入的了解,但现在这种做法很有用。