2013-03-22 9 views
7

Napisałem oprogramowanie pośrednie do Connect i Express, które wymaga pewnego podnoszenia w swojej metodzie instalacji. Ze względu na naturę zadań inicjalizacyjnych te rzeczy są asynchroniczne, więc mam problem z tym, że oprogramowanie pośrednie będzie dostępne tylko po uruchomieniu inicjalizacji.Jak korzystać z asynchronicznej inicjalizacji w oprogramowaniu pośrednim Connect?

Obecnie mam rozwiązać go za pomocą wywołania zwrotnego:

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

To działa, ale nie jest to miłe dla rozmówcy. Zamiast być w stanie zrobić

app.use(setupMiddleware()); 

mam zrobić:

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

Teraz myślałem, czy istnieje lepsze podejście, na przykład niech oprogramowanie pośrednie inicjalizuje się w tle i opóźnia wszystkie przychodzące żądania, dopóki oprogramowanie pośrednie nie będzie gotowe.

Jak mogę rozwiązać ten problem? Jakieś pomysły lub najlepsze praktyki, których powinienem tutaj użyć?

Odpowiedz

2

teraz rozwiązać go za pomocą zmiennej isInitialized i opóźniając samą funkcję middleware. Zobacz poniższy przykład:

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

Należy pamiętać, że kod ten nie został zoptymalizowany refactored lub w jakikolwiek sposób, to po prostu jest wykazanie, że sama idea działa.

0

Dlaczego nie lubię jak następuje,

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

}); 
+1

Ponieważ inicjalizacja dotyczy tylko jednego oprogramowania pośredniego, a nie całej aplikacji. Ten schemat oczywiście działa, ale nie jest "przyjemny". Nie podoba mi się, że wszystko jest wcięte jeden krok (i to nie jest tylko problem formatowania ;-)). –

+0

Akceptuję to. Ponieważ Nodejs nie jest blokujący, musisz uzyskać kod w długotrwałym procesie oddzwaniania lub w sposób pokazany w pytaniu. Ofcource, możesz użyć jakiegoś modułu async. Tutaj założyłem, że twoje oprogramowanie pośrednie jest obowiązkowe dla wszystkich żądań, dzięki czemu zachowałeś funkcję app.use(). Moja sugestia jest taka, że ​​po prostu inicjujesz oprogramowanie pośrednie, zanim zaczniesz słuchać portu. Jeśli oczekujesz więcej niż formatowania, muszę zrozumieć, co się dzieje z funkcją "doSomeAsyncInitialization". –

+0

Cóż, tak jak powiedzieliśmy, może się zdarzyć, że funkcja konfiguracji natychmiast zwróci oprogramowanie pośrednie, ale oprogramowanie pośredniczące opóźnia otrzymywanie żądań do momentu pełnego zainicjowania. –

Powiązane problemy