2013-03-22 8 views
7

मैंने कनेक्ट और एक्सप्रेस के लिए एक मिडलवेयर लिखा है जिसके लिए इसकी सेटअप विधि में कुछ भारी उठाने की आवश्यकता है। प्रारंभिक कार्यों की प्रकृति के कारण यह सामान असीमित है, इसलिए मुझे समस्या है कि प्रारंभिक होने के बाद मिडलवेयर केवल पहुंच योग्य होगा।कनेक्ट मिडलवेयर में एसिंक्रोनस प्रारंभिकरण का उपयोग कैसे करें?

वर्तमान में मैं यह एक कॉलबैक का उपयोग कर हल कर लिया है:

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

यह काम करता है, लेकिन यह फोन करने वाले के लिए अच्छा नहीं है। इसके बजाय ऐसा करने में सक्षम होने का

app.use(setupMiddleware()); 

मैं क्या करना है:

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

अब मैं सोच रहा था कि वहाँ एक बेहतर दृष्टिकोण, उदा है कि क्या मिडलवेयर को पृष्ठभूमि में प्रारंभ करने दें और सभी आने वाले अनुरोधों को देरी करें जब तक कि मिडलवेयर तैयार न हो जाए।

मैं इसे कैसे हल कर सकता हूं? किसी भी विचार या सर्वोत्तम प्रथाओं का मुझे यहां उपयोग करना चाहिए?

उत्तर

2

मैं अब यह एक isInitialized चर का उपयोग कर और मिडलवेयर समारोह अपने आप में देरी को हल किया। निम्नलिखित उदाहरण देखें:

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

कृपया ध्यान दें कि इस कोड को अनुकूलित नहीं किया गया है या किसी भी तरह पुनर्संशोधित, यह सिर्फ एक प्रदर्शन है कि इस विचार से ही काम करती है।

0

तुम क्यों इस प्रकार की तरह नहीं करते हैं,

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

}); 
+1

क्योंकि प्रारंभिकरण केवल एक मिडलवेयर के लिए है, पूरे ऐप के लिए नहीं। और पाठ्यक्रम का यह पैटर्न काम करता है, लेकिन यह "अच्छा" नहीं है। मुझे नापसंद है कि सबकुछ एक कदम है (और यह सिर्फ एक स्वरूपण समस्या नहीं है ;-))। –

+0

मैं इसे स्वीकार करता हूं। चूंकि नोडज गैर-अवरुद्ध है, इसलिए आपको लंबे समय तक चलने वाली प्रक्रिया कॉलबैक में या अपने प्रश्न में दिखाए गए तरीके से कोड प्राप्त करना होगा। ऑफकॉर्स, आप कुछ async मॉड्यूल का उपयोग कर सकते हैं। यहां मैंने मान लिया है कि आपके अनुरोध के लिए आपका मिडलवेयर अनिवार्य है, ताकि आप app.use() फ़ंक्शन में रख सकें। और मेरा सुझाव है, आप बंदरगाह सुनना शुरू करने से पहले बस मिडलवेयर शुरू करें। यदि आप स्वरूपण से अधिक की अपेक्षा कर रहे हैं, तो मुझे समझना होगा कि "doSomeAsyncInitialization" फ़ंक्शन पर क्या चल रहा है। –

+0

ठीक है, जैसा कि कहा गया है, एक विचार यह हो सकता है कि सेटअप फ़ंक्शन तुरंत मिडलवेयर लौटाता है, लेकिन जब तक कि यह पूरी तरह से प्रारंभ नहीं हो जाता है, तब तक मध्यवर्ती आने वाले अनुरोधों को देरी करता है। –

संबंधित मुद्दे