在所有服务启动后启动 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;
};
也许有更好的方法?谢谢。
有多种方法可以处理异步流。
对于您的特定情况:
承诺方法
generators/coroutines
async/await
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。
例如我有两个服务:数据库和队列 我需要在 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;
};
也许有更好的方法?谢谢。
有多种方法可以处理异步流。 对于您的特定情况:
承诺方法
generators/coroutines
async/await
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。