直接关闭节点程序是隐藏症状,而不是解决问题!
我终于隔离了这个问题,发现它与 Mongoose 模式定义有关。如果您在定义 Mongoose 模式后过早关闭连接1,应用程序将挂起并最终产生一些与 MongDB 相关的奇怪错误。
program.parse(argv)
在运行命令应用程序之前添加一个小的超时可以解决问题。只需像这样包装代码:
var program = require('commander')
, mongoose = require('mongoose')
, models = null
;
// Define command line syntax.
program
.command(...)
;
mongoose.connect(
..., // connection parameters.
function() {
// connected to database, defined schemas.
models = require('./models');
// Wait 1 second before running the application code.
setTimeout(function(){
program.parser(process.argv);
}, 1000);
}
);
1:这是我最初的解释,我还没有(还)广泛地测试过这个理论。但是,从应用程序中删除 Mongoose 模式定义成功地防止了应用程序挂起。
实际上,只需使用process.nextTick()
而不是setTimeout()
调用就可以很好地解决这种情况!