在所有服务启动后启动 node.js 应用程序

start node.js app after all services are started

例如我有两个服务:数据库和队列 我需要在 db 和 amqp 连接到他们的服务器后启动服务器。

现在我有这样的东西server.js:

let mongo = require('./server/db');
let qManager = require('./server/amqp');

mongo.connect(()=>{
    qManager.connect(()=>{
        http.listen(3001, function () {
            console.log('listening on *:3001');
        });
    });
});

mongo连接方式:

const connectDb = (callback) => {
    if (state.db) return state.db;
    let connection = MongoClient.connect(mongoUrl, (err, db) => {
        if (err) {
            connectDb();
        }
        state.db = db;
        console.log('Mongo connected.');
        callback();
    });
};

rabbitmq连接方式:

const connect = (callback) => {
    connection = amqp.connect(url)
        .then(conn => {
            module.connection = conn;
            channel = conn.createChannel();
            console.log('Queue connected.');
            pythonResultListener();

            callback()
        })
        .catch(err => {
            console.error('Connect failed: %s', err);
        });
    return connection;
};

也许有更好的方法?谢谢。

有多种方法可以处理异步流。 对于您的特定情况:

async/await 的快速示例:

// First you modify your callback function to be promises
// For example mongoconnect method implementation:
const connectDb = function() {
  return new Promise (resolve, reject) => {
    if (state.db) return state.db;
    let connection = MongoClient.connect(mongoUrl, (err, db) => {
      if (err) return reject(err);
      state.db = db;
      console.log('Mongo connected.');
      resolve();
    });
  });
};

现在,假设您有承诺 A、B、C,您的目标是一一调用它们:

const promises = [ A, B, C ];
for (const promiseFunc of promises) {
  const res = await promiseFunc();
  // For cases you need to return something
  console.log(res);
}

您可以找到更多信息 here