【问题标题】:node program with promises doesn't finish带有承诺的节点程序没有完成
【发布时间】:2014-07-25 13:46:59
【问题描述】:

我终其一生都无法弄清楚为什么这没有完成:

var pmongo = require('promised-mongo');
var db = pmongo('mongodb://localhost/builder');
var block_id = '538d097bbb12479d0e9f70ab';

var collection = db.collection('block');
collection.findOne({_id:db.ObjectId(block_id)})
.then(function(result) {
    console.dir(result);
}).done();

它基本上只是挂起。 findOne 返回一个承诺,我正在调用完成。奇怪的是,当我在 then 中关闭数据库(即 db.close())时,它完成了。

我试图最终通过 express 处理这个问题,所以我真的不想关闭数据库。有什么诀窍???

【问题讨论】:

  • 为什么最后没有参数的额外.done()?对于您正在做的事情,您只需要.then().done(),而不是两者都需要。当您同时使用两者时,您将链接多个操作,但您没有多个操作。
  • 诀窍就是在完成连接后关闭连接。只要有可能发生另一个事件,节点就会继续运行。而且,只要连接处于打开状态,就会假定这种潜力。
  • 我放了很多 .done() 希望它会导致它停止。看起来很奇怪。在我做出承诺之前,这将停止
  • @NickLang 如果原始 mongodb 在 console.dir 之后停止,'promised-mongo' 可能正在执行原始 mongodb 以外的其他操作。正常的承诺根本不会影响这些事情。

标签: node.js mongodb promise mongojs


【解决方案1】:

MongoDB 连接旨在保持持久性。您创建其中一个(或其中一个池),然后在整个应用程序中重复使用该连接。

这个持久的网络连接会让node.js进程保持活跃,所以当你想关闭node进程时,你必须手动关闭连接。这是数据库连接的常见模式,如果您连接到 MySQL,也会发生同样的事情。

在 express.js 应用程序中,只需在文件顶部建立一次连接,然后为每个请求重新使用该连接。

【讨论】:

  • OP 知道,承诺只有在连接关闭时才会执行。
  • 这不是我的印象。如果在.then 调用中添加 db.close 可以使一切正常,那么我认为假设承诺“执行”是公平的。我相信 OP 的“没有完成”的意思是 node.js 程序没有退出。我的回答涵盖了为什么会这样。
  • 两种可能性:1.它没有,其他东西让它看起来像它(例如程序调用 process.exit(0) 的其他部分)2.它工作是因为 mongodb用于回调的库正在为每个数据库请求打开和关闭连接。虽然这是可能的,但这对性能来说并不是一个好主意。
猜你喜欢
  • 1970-01-01
  • 2021-10-20
  • 2020-10-25
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
相关资源
最近更新 更多