1

这是我的 test1.js

console.log("foo");

当我运行 test1.js 时,我得到了命令行

$ node test2.js
foo
$

这是我的 test2.js,使用 MongoDbClient

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://local.host/test?w=1", function(err, db) {
   console.log("foo");
});

但是,当我运行 test2.js 时,我必须按 CTRL-C 才能返回命令行

$ node test3.js
foo
^C
$

有什么不同?我应该怎么做才能恢复命令行(可能是关闭连接)?

4

1 回答 1

3

当订阅了一些事件并且可能发生潜在的逻辑时,Node.js 不会关闭应用程序。

当您创建 MongoClient 时,它也会创建 EventEmitter 并且它不会让 node.js 进程退出,因为它可能会接收一些事件。

如果你想找回光标 - 那么你有几个选择:

  1. 很好地杀死所有 EventEmitters 和空闲计时器和间隔,然后进程将退出。但很难实现。
  2. 只需调用:process.exit(0)这将很好地关闭进程。

以及检查refunref定时器功能(间隔,超时):http ://nodejs.org/api/timers.html#timers_unref

如果使用 MongoClient,只需在完成后关闭数据库连接:

var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017/testdb', function(err, db) {
  // do your stuff

  // when you are done with database, make sure to respect async queries:
  db.close();
});
于 2013-09-11T16:32:20.167 回答