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



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

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

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

确保在侦听之前连接的唯一方法是将其链接起来。如果您在导出时遇到问题,则是因为您弄错了导入/导出。导入/导出不应对您的系统产生任何影响。每一个动作都应该被触发,而不是被暗示。

您应该考虑将所有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
});

实现这一点的方法很少。

一种将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'));

最新更新