2017-08-10 214 views
0

例如我有两个服务:db和队列 我需要在db和amqp连接到它们的服务器之后启动服务器。在所有服务启动后启动node.js应用程序

现在我有这样的事情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'); 
     }); 
    }); 
}); 

蒙戈连接方法:

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; 
}; 

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

回答

0

处理异步流程有几种方法。 对于你的具体情况:

非常快EXA mple与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

0

你做得很好。在启动服务器之前放置所有init逻辑。直到完成所有初始化后才启动服务器。

你可以模块化将独立的初始化放置在它们各自的模块中的一件事。这样你可以很好地管理它们。

相关问题