Express - 在配置之前收听?

时间:2013-11-01 15:34:05

标签: node.js express middleware

这是一个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)

2 个答案:

答案 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也有一个非常好的解决方案,我刚刚实现了这个。