等待数据库连接,然后接受请求

时间:2019-01-09 15:18:18

标签: node.js express rxjs

我遇到的问题是我的快速服务器在建立数据库连接之前启动了。人们可以在一段时间未建立连接时向应用程序发送请求:

const app = express();
dbClient.connect()
  .subscribe(() => console.log('connection established!'));

module.exports = app.listen(8080, () => {
  console.log('the server is running');
});

其结果是:

the server is running // some seconds break
connection established! // now everything works properly

如何仅在订阅者运行后才能开始监听事件?

2 个答案:

答案 0 :(得分:1)

确保在收听之前已连接您的唯一方法是将其链接。如果您在导出时遇到麻烦,则结果是因为您误导入/导出。导入/导出对您的系统不会有任何影响。每个动作都应该触发而不是暗含。

您应该考虑将所有Express处理放入一个类,然后在控制器中使用它。这样您可以处理错误...例如:

// File a.js

let instance = null;

export default class ServerApi {

  constructor() {
    if (instance) return instance;

    instance = this;

    return instance;
  }

  static getInstance() {
    return instance || new ServerApi();
  }

  startServer(callback) {
    const app = express();

    dbClient.connect()
      .subscribe(() => {
        console.log('connection established!');

        app.listen(8080, () => {
          console.log('the server is running');

          callback();
        });
      });
  }

  stopServer() { ... }

  getServerStatus() { ... }
};

// File controller.js

import ServerApi from 'a.js';

ServerApi.getInstance().startServer(() => {
  // handle error
  // handle success
});

答案 1 :(得分:1)

实现这一目标的方法很少。

一种将app.listen包装为可观察的方法

const app = express();

const connectApp = (port = 8080) => new Observable(observer => app.listen(port, () => {
  observer.next(app);
  observer.complete();
});

dbClient.connect()
   .pipe(
       tap(() => console.log('connection established!')),
       mergeMap(() => connectApp()),
       tap(() => console.log('the server is running')),
    )
  .subscribe(() => console.log('Enjoy'));