【问题标题】:Waiting for database connection before accepting requests在接受请求之前等待数据库连接
【发布时间】:2019-01-09 15:18:18
【问题描述】:

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

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

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

【问题讨论】:

  • app.listen(8080, ...) 调用放入subscribe()
  • 那我导出不了了

标签: node.js express rxjs


【解决方案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
});

【讨论】:

    【解决方案2】:

    实现这一点的方法很少。

    一种将 app.listen 包装成 observable 的方法

    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'));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      相关资源
      最近更新 更多