2017-08-10 208 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邏輯。直到完成所有初始化後才啓動服務器。

你可以模塊化將獨立的初始化放置在它們各自的模塊中的一件事。這樣你可以很好地管理它們。

相關問題