Node.js:在创建HTTP服务器之前等待MongoDB连接建立

10

在我的app.js中,当应用程序启动时,我会创建一个MongoDB连接。

mongoose.connect(config.db, {});

var db = mongoose.connection;
db.on('error', function () {
    log.error("Failed to connect to database");
    process.exit(1);
});
db.once('open', function () {
    log.info("Connected to database");
});

app.jsbin/www.js中使用(使用require('./../app')),其中创建了http服务器。

目前,如果数据库连接不成功,则应用程序会终止,但是在终止之前已经创建了http服务器,因为异步地报告了数据库创建失败。

我需要阻止http服务器的创建直到数据库连接成功,但是我需要将服务器创建代码保留在bin/www.js中,而不是将其移动到app.js中的数据库连接成功回调函数中。

有什么方法可以做到这一点吗?


app.js被用于bin/www.js中(通过require('./../app')),用于创建http服务器。

当前情况下,如果数据库连接不成功,应用程序会终止,但是由于数据库创建失败是异步报告的,所以在终止之前已经创建了http服务器。

我需要阻止http服务器的创建,直到数据库连接成功,但我需要将服务器创建的代码保留在bin/www.js中,而不是将其移到app.js中的数据库连接成功回调函数中。

是否有任何方法可以实现这一点?


1
将您的Web服务器侦听器移动到db.once('open'....内部。 - Saleem
1个回答

11

只有在连接完成后才能启动您的服务器:

db.once('open', function () {
   log.info('Connected to database');
   launchMyServer()
});

如果你想在另一个文件中使用它:

module.exports = function initConnection(callback) {
  mongoose.connect(config.db, {});
  var db = mongoose.connection;
  db.on('error', function (err) {
    log.error('Failed to connect to database');
    process.exit(1);
  });

  db.once('open', function () {
    log.info("Connected to database");
    callback();
  });
};

并且从您的 www.js 文件中:

const initConnection = require('./../app')

initConnection(function () {
  launchMyServer()
})

正如我之前提到的,服务器创建是在 bin/www.js 中完成的,而 app.js 是从其中包含的,这里建立了数据库连接。我希望保持这种方式。 - Lahiru Chandima
你可以使用 module.exports = 导出函数。 - L. Meyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接