我遇到的问题是我的快速服务器在建立数据库连接之前启动了。人们可以在一段时间未建立连接时向应用程序发送请求:
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
如何仅在订阅者运行后才能开始监听事件?
答案 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'));