0


这是一个两部分的问题,

第 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)

4

2 回答 2

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是值得考虑的事情。

于 2013-11-01T19:31:20.293 回答
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 也有一个非常棒的解决方案,我只是先实现了这个。

于 2013-11-01T21:03:31.913 回答