在启动快速服务器之前等待多个数据库连接?

时间:2015-01-24 04:15:34

标签: node.js postgresql asynchronous express node-redis

我正在开发一款Express应用。在启动时,它连接到Redis服务器和PostgreSQL服务器。我想在启动快速服务器之前等待两个连接成功。现在,如果我等待一个回调,我可以在该回调中启动Express服务器。但是,在等待多个异步操作时如何最好地做到这一点?我是新手。做这种事情有一个很好的惯用模式吗?也许将承诺分组在一起或者......?

3 个答案:

答案 0 :(得分:3)

承诺就是你想要的。

您可以在一系列承诺上使用.all()等待所有承诺完成。你没有提到你正在使用的Promise库,但它相当普遍。这是Bluebird文档:https://github.com/petkaantonov/bluebird/blob/master/API.md#all---promise

答案 1 :(得分:1)

承诺可能是解决这个问题的惯用方法。你必须" promisify"您的函数返回回调以将它们转换为返回并解析promise的内容,但是Promise.all()将正常工作。我个人使用Bluebird进行nodejs开发,并定期宣传使用异步回调的现有函数或整个模块。


如果您没有使用可以宣传未承诺功能的库,那么您也可以使用计数器来跟踪所有回调的完成时间。这是老式的"做事的方式,但也很好。这样的操作就像这样:

function setup(fn) {
    // initialize counter to number of async operations
    var counter = 3;
    function checkDone() {
        --counter;
        if (counter <= 0) {
            fn();
        }
    }

    firstAsyncFunction(...., checkDone);
    secondAsyncFunction(...., checkDone);
    thirdAsyncFunction(...., checkDone);

}

setup(function() {
    // this will get called when all the initial async operations are done
});

答案 2 :(得分:0)

就我而言,在启动我的应用程序之前,我需要等待mongodb和redis连接。下面是我的实现。

注意:我正在使用Koa,但是相同的实现也应该与Express.js一起使用。

redis-connection.ts文件

let your_bytes = Buffer.from(your_base64, "base64");

db-connection.ts文件

    import redis from 'redis'

    const redisConnection = (app) => {

       const client = redis.createClient({ url:'connectionString' })

       client.set('hello', 'world', (err)=> {

          if(err) {
             throw err
          }

          app.emit('redis-connected')
       })
    }

export default redisConnection

app.ts文件

import mongoose from 'mongoose';

const dbConnection = (app) => {

    mongoose.connect('connectionString', {
        useNewUrlParser: true,
        useCreateIndex: true,
        useUnifiedTopology: true,
        useFindAndModify: false
    });

    mongoose.connection.once('open', () => {
        app.emit('db-connected');
    });

    return mongoose;
};

export default dbConnection;

index.ts文件

'use strict'

import Koa from 'koa'
import dbConnection from './config/connections/db-connection'
import redisConnection from './config/connections/redis-connection'

const app: Koa.DefaultState = new Koa()

// Perform db connection
dbConnection(app)

// Perform redis connection
redisConnection(app)

export default app