2011-12-28 22 views
71

मैं यह पता लगाने की कोशिश कर रहा हूं कि एक्सप्रेस का उदाहरण कैसे बंद करें। असल में, मैं .listen(port) कॉल के विपरीत चाहता हूं - मुझे स्ट्रीम बंद करने, बंदरगाह को छोड़ने और बंद करने के लिए एक एक्सप्रेस सर्वर कैसे प्राप्त करें?परीक्षण के लिए मैं ExpressJS के उदाहरण को प्रोग्रामेटिक रूप से कैसे बंद कर सकता हूं?

मुझे पता है ऐसा लगता है कि यह एक अजीब सवाल हो सकता है, इसलिए यहां संदर्भ है; शायद इस तक पहुंचने का एक और तरीका है और मैं इसके बारे में गलत तरीके से सोच रहा हूं। मैं अपने socket.io/nodejs ऐप के लिए एक परीक्षण ढांचा स्थापित करने की कोशिश कर रहा हूं। यह एक एकल पृष्ठ ऐप है, इसलिए मेरी परीक्षण स्क्रिप्ट्स में (मैं Mocha का उपयोग कर रहा हूं, लेकिन यह वास्तव में कोई फर्क नहीं पड़ता) मैं सर्वर को शुरू करने, इसके खिलाफ परीक्षण चलाने में सक्षम होना चाहता हूं, और फिर सर्वर को बंद कर सकता हूं। मैं यह मानकर यह प्राप्त कर सकता हूं कि या तो परीक्षण शुरू होने से पहले सर्वर चालू हो जाता है या परीक्षणों में से एक होने से सर्वर शुरू होता है और प्रत्येक बाद के परीक्षण के बाद यह लगता है कि यह वास्तव में गन्दा है। मैं प्रत्येक टेस्ट फ़ाइल को उचित सेटिंग्स के साथ एक सर्वर इंस्टेंस शुरू करना पसंद करूंगा और फिर परीक्षण खत्म होने पर उस इंस्टेंस को बंद कर दूंगा। इसका मतलब है कि परीक्षण चलाने के लिए कोई अजीब निर्भरता नहीं है और सब कुछ साफ है। इसका मतलब यह भी है कि मैं स्टार्टअप/शटडाउन परीक्षण कर सकता हूं।

तो, यह कैसे करें इसके बारे में कोई सलाह है? मैंने इसे नीचे लाने के लिए अपवादों को मैन्युअल रूप से ट्रिगर करने के बारे में सोचा है, लेकिन यह गन्दा लगता है। मैंने एक्सप्रेस डॉक्स और स्रोत के माध्यम से खोला है, लेकिन ऐसा कोई प्रतीत नहीं होता है जो सर्वर को बंद कर देगा। इसके लिए socket.io में कुछ भी हो सकता है, लेकिन चूंकि सॉकेट सर्वर सिर्फ एक्सप्रेस सर्वर से जुड़ा हुआ है, मुझे लगता है कि यह एक्सप्रेस परत पर होने की आवश्यकता है।

उत्तर

100

Things have changed क्योंकि एक्सप्रेस सर्वर नहीं रह गया है नोड http सर्वर से इनहेरिट करती है। सौभाग्य से, app.listen सर्वर उदाहरण देता है।

var server = app.listen(3000); 

// listen for an event 
var handler = function() { 
    server.close(); 
}; 
+13

मोचा परीक्षण के मामले में, जहां आपको आवश्यकता है ('ऐप') मैं ऐप ऑब्जेक्ट पर विस्तार करता हूं: app.server = app.listen (3000); तो बाद में मैं कह सकता हूं: var app = आवश्यकता ('./ app'); app.server.close(); सर्वर का परीक्षण करते समय –

+1

, https://github.com/visionmedia/supertest देखें, यह आपको वास्तविक सर्वर लॉन्च करने के लिए w/o परीक्षण करने देगा –

0

आप सर्वर को शुरू करने, परीक्षण चलाने और सर्वर को रोकने के लिए बैश स्क्रिप्ट लिखकर आसानी से ऐसा कर सकते हैं। यह आपके सभी परीक्षणों को तेज़ी से और आसानी से चलाने के लिए आपको उस स्क्रिप्ट पर उपनाम करने की अनुमति देने का लाभ है।

मैं अपनी पूरी निरंतर तैनाती प्रक्रिया के लिए ऐसी स्क्रिप्ट का उपयोग करता हूं। इस पर कुछ अंतर्दृष्टि के लिए आपको Jon Rohan's Dead Simple Git Workflow पर देखना चाहिए।

+2

यह काम करेगा, लेकिन यदि संभव हो तो मैं एक बैश-मुक्त समाधान पसंद करूंगा। हो सकता है कि यह एक बेवकूफ वरीयता है, लेकिन मैं सर्वर को टेस्ट संदर्भ से शुरू/रोकना चाहता हूं क्योंकि यह सर्वर-कॉन्फ़िगर-विशिष्ट परीक्षण + स्टार्टअप/शट डाउन परीक्षण लिखना आसान बनाता है। इसके अलावा, यह एक अलग लिपि के माध्यम से सर्वर से संबंधित परीक्षण चलाने के संकेत का परिचय नहीं देता है। – drewww

+0

आप पर्यावरण-विशिष्ट परीक्षण क्यों लिख रहे हैं? शायद मैं गलत हूं, लेकिन यह मुझे बुरी आदत के रूप में मारता है। मैं आपके परीक्षण के साथ पर्यावरण अज्ञेयवादी रहने की कोशिश करता हूं, क्योंकि आप चाहते हैं कि आपके परीक्षण पर्यावरण के बावजूद आपकी टीम में काम करें। –

+0

मैं यहां कुछ भी पर्यावरण-विशिष्ट नहीं कर रहा हूं, मुझे नहीं लगता। सर्वर के लिए अलग-अलग स्टार्टअप विकल्प होंगे (जैसे फ़ाइल से कॉन्फ़िगरेशन विकल्प पढ़ने, डेटास्टोर से राज्य लोड करना आदि) कि एक ही ढांचे में परीक्षण करना अच्छा होगा, मैं बाकी सब कुछ परीक्षण करता हूं। मैं परीक्षण करना चाहूंगा कि, उदाहरण के लिए, सर्वर को बंद करें, इसे फिर से वापस लाएं, और सुनिश्चित करें कि यह प्रक्रिया में स्थिति खो नहीं गया है। यह आसान है अगर मैं इसे नोड से प्रोग्रामेटिक रूप से बैश में परीक्षण कोड की तुलना में कर सकता हूं। – drewww

12

app.close() का उपयोग करें। पूर्ण उदाहरण:

var app = require('express').createServer(); 
app.get('/', function(req, res){ 
    res.send('hello world'); 
}); 
app.get('/quit', function(req,res) { 
    res.send('closing..'); 
    app.close(); 
}); 
app.listen(3000); 

कॉल समाप्त होने पर कॉलबैक के अंदर app.close() पर कॉल करें। लेकिन याद रखें कि प्रक्रिया अभी भी चल रही है (हालांकि यह अब और नहीं सुन रही है)।

यदि इसके बाद, आपको प्रक्रिया समाप्त करने की आवश्यकता है, तो process.exit(0) पर कॉल करें।

लिंक:

app.close: http://nodejs.org/docs/latest/api/http.html#server.close (समान के लिए लागू होता है)

process.exit: http://nodejs.org/docs/latest/api/process.html#process.exit

+1

बिल्कुल सही, ठीक वही जो मैं खोज रहा था। मुझे लगता है कि मुझे इसे एक्सप्रेस में नहीं मिला क्योंकि वे कोर नोड http सर्वर का विस्तार कर रहे थे, जिसे मैं पूरी तरह से समझ नहीं पाया था। धन्यवाद! – drewww

+0

धन्यवाद श्रीजन, इससे मुझे भी मदद मिली –

+0

क्या यह अभी भी सच है? express.createServer को बहिष्कृत के रूप में चिह्नित किया गया है, और यह बताता है कि ऐप अब http.js के सर्वर से विरासत में नहीं आता है –

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

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