如何在Connect中间件中使用asynchronous初始化?

我为Connect和Express编写了一个中间件,需要一些繁重的工作。 由于初始化任务的性质,这个东西是asynchronous的,所以我有一个问题,即中间件只能在初始化运行后才能访问。

目前我已经解决了它使用callback:

function setupMiddleware(callback) { doSomeAsyncInitialization(function () { callback(function (req, res, next) { // The actual middleware goes here ... }); }); } 

这有效,但对呼叫者不好。 而不是能够做到

 app.use(setupMiddleware()); 

我要做:

 setupMiddleware(functin (middleware) { app.use(middleware); }); 

现在我正在考虑是否有更好的方法,例如让中间件在后台初始化,并延迟所有传入的请求,直到中间件准备就绪。

我怎么能解决这个问题? 我应该在这里使用任何想法或最佳做法?

我现在使用isInitializedvariables解决了它,并延迟了中间件function本身。 看下面的例子:

 var connect = require('connect'); var setup = function () { var isInitialized = false; setTimeout(function () { isInitialized = true; }, 10000); function run (req, res, next) { res.write('Foo'); res.end(); } function delay (req, res, next) { if (isInitialized) { return run(req, res, next); } setTimeout(function () { delay(req, res, next); }, 1000); } return function (req, res, next) { if (req.url === '/foo') { delay(req, res, next); return; } next(); } }; var app = connect(); app.use(setup()); app.use(function (req, res) { res.write('Fertig!'); res.end(); }); var http = require('http'); http.createServer(app).listen(5000); 

请注意,这个代码还没有被优化或重构,只是这个想法本身的作用。

为什么你不这样做,如下所示,

 doSomeAsyncInitialization(function () { //After doing all long running init process just configure your express as follows. app.use(<middlewares>); app.listen(<portnumder>); });