这是一个2部分问题,
第1部分,我有一个使用express的应用程序,我正在努力实现零停机时间部署。我的问题是我可以启动服务器然后添加我的配置吗?像所以:
var app = require("express")
var hasInited = false;
app.use(function(req,res,next){
while(!hasInited){}
})
var server = require("http").createServer(app)
server.listen(8080);
// Add calls to app.use, app.get, app.post, etc. here...
hasInited = true;
第2部分,除此之外,还有一种方法可以从底部删除堆栈中的中间件吗?比如app.removeMiddlewareAtIndex(0)
?
答案 0 :(得分:2)
您可以尝试这样的事情,而不是使用繁忙的等待循环:
var EventEmitter = require('events').EventEmitter;
var guard = new EventEmitter();
...
var hasInited = false;
app.use(function(req, res, next) {
if (hasInited)
return next();
guard.once('hasInited', function() {
hasInited = true;
next();
});
});
...
// when everything is ready:
guard.emit('hasInited');
额外的中间件的开销并不是我会从中间件链中删除它(可以完成,但只有一点点黑客攻击)。
但也许pm2
值得考虑。
答案 1 :(得分:0)
很抱歉回答我自己的问题,我写了自己的小图书馆whenjs,然后我想出了这个:
// listen.js
var http = require("http")
var when = require("whenjs")
module.exports.init = function(app){
module.__app = app;
module.__appIsReady = false;
var http = http.createServer(function(req,res){
if(module.__appIsReady){
module.__app(req, res)
} else {
when(function(){ return module.__appIsReady; }, function() {
module.__app(req, res)
})
}
})
}
module.exports.ready = function(){
module.__appIsReady = true;
}
// server.js
var listen = require("./listen");
var app = require("express")();
listen.init(app);
// Build The App Here
listen.ready();
我已经有了一个https和http服务器,所以这几乎有同样的意义。
但是robertklep也有一个非常好的解决方案,我刚刚实现了这个。