gpt4 book ai didi

node.js - 等待来自不同模块的多个事件,然后启动服务器

转载 作者:IT王子 更新时间:2023-10-29 06:05:27 26 4
gpt4 key购买 nike

我正在构建一个应用程序,其中有 2 个不同的模块。其中一个是与 mongodb 的连接,另一个模块是与 redis 的连接以进行 session 管理。在这种情况下,每个模块都有 2 个事件错误和连接。这是其中一个模块的示例:

var sessionStore = new SessionStore(app.get("sessionStore"));

sessionStore.client.on("error", function(err) {

console.error("[SessionStore]:", "connection error:", err.address + ":" + err.port, "for process:", process.pid);

var sessionStoreError = new Error("Session store error");
sessionStoreError.message = "Session store connection error";
sessionStoreError.code = err.code;
sessionStoreError.address = err.address;
sessionStoreError.port = err.port;

app.emit("error", sessionStoreError);

});


sessionStore.client.on("connect", function() {

console.log("[SessionStore]:", "connection established:", app.get("sessionStore").host + ":" + app.get("sessionStore"), "for process:", process.pid);
app.emit("ready");

});

几乎相同的方式发生在 mongodb 模块上。

我想要实现的(避免厄运金字塔)是这样的,但是当来自它们模块的 redis 和 mongodb 连接都成功时:

app.on("ready", function(){
app.listen(app.get("port"));
});

请记住,我可以将每个模块嵌套在另一个模块中,并且可能在连接处理程序中按顺序要求模块,然后向应用程序发出最终事件,但根据我的口味,我认为这并不优雅。

有什么优雅的方法可以等待 2 个事件然后启动服务器吗?

最佳答案

bootable提供了一个初始化层,您也可以将其用于 Express 应用程序。这并没有严格地为您的问题(“等待 2 个事件”)提供解决方案,但它确实解决了在启动服务器之前等待多个异步模块的问题。

您可以为 MongoDB 和 Redis 添加引导阶段。一旦所有阶段都准备就绪,将调用对 app.boot() 的回调(您可以在那里检查是否有任何初始化错误),当一切正常时,应用程序可以开始监听传入连接。

这里是你的 session 存储例子变成了引导阶段:

module.exports = function(app) {
app.phase(function(done) {
var sessionStore = new SessionStore(app.get("sessionStore"));

sessionStore.client.once("error", function(err) {
console.error("[SessionStore]:", "connection error:", err.address + ":" + err.port, "for process:", process.pid);

var sessionStoreError = new Error("Session store error");
sessionStoreError.message = "Session store connection error";
sessionStoreError.code = err.code;
sessionStoreError.address = err.address;
sessionStoreError.port = err.port;

return done(sessionStoreError);
});

sessionStore.client.once("connect", function() {
console.log("[SessionStore]:", "connection established:", app.get("sessionStore").host + ":" + app.get("sessionStore"), "for process:", process.pid);
return done();
});
});
};

你的主要代码看起来像这样:

var bootable = require('bootable');
var express = require('express')
var app = bootable(express());

require('./boot/session-store')(app); // loads the module above
require('./boot/mongodb')(app); // a MongoDB boot phase

// This is the equivalent of your `app.on('ready', ...)`
app.boot(function(err) {
if (err) throw err;
app.listen(app.get("port"));
});

关于node.js - 等待来自不同模块的多个事件,然后启动服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34042527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com