मैं परीक्षण के लिए एक्सप्रेसजेएस के एक उदाहरण को प्रोग्रामेटिक रूप से कैसे बंद कर सकता हूं?


106

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

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

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

जवाबों:


156

चीजें बदल गई हैं क्योंकि एक्सप्रेस सर्वर अब नोड http सर्वर से विरासत में नहीं मिला है। सौभाग्य से, app.listen सर्वर उदाहरण देता है।

var server = app.listen(3000);

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

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

2
जब सर्वर का परीक्षण हो रहा है, तो github.com/visionmedia/supertest की जांच करें यह आपको वास्तविक सर्वर को लॉन्च करने के लिए w / o का परीक्षण करने देगा
लुकास लिसिस

मैं यह भी सुझाव दूंगा कि server.close()यदि आप इसे एक हुक के भीतर से कर रहे हैं तो कॉलबैक पास करें ।
उल्लौरी ३०'१

नोट: 'ऐप' के बीच एक बड़ा अंतर है, जो कि एक्सप्रेस एप्लिकेशन इंस्टेंस है, और 'ऐप.लिस्टेन' का रिटर्न वैल्यू, जो अंतर्निहित देशी HTTP सर्वर इंस्टेंस है, जिसमें 'क्लोज' विधि है। @JackChi ने इस पर संकेत दिया।
अंजस

क्या यह खुले क्लाइंट सॉकेट के साथ समस्या नहीं है जो खुले छोड़ दिए जाते हैं?
कैमरन टैकलिंड

18

का उपयोग करें 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

धन्यवाद श्रीजन, जिसने मेरी भी मदद की
एडम हॉपकिंसन

क्या यह अभी भी सच है? express.createServer, पदावनत के रूप में निशान है, और यह कहते हुए एक त्रुटि देता है कि ऐप http.js के सर्वर से विरासत में नहीं मिलता है
फ्रैंक

4
यह व्यक्त 3 के बाद से मान्य नहीं है।
gprasant

4
एक सर्वर को इस तरह से बंद करने के लिए एक URL को उजागर करना एक अच्छा विचार नहीं है IMHO।
शिम

2

मैंने कई बार "HTTP सर्वर को कैसे समाप्त करें" की भिन्नता का उत्तर दिया है समर्थन चैनल। दुर्भाग्य से, मैं मौजूदा पुस्तकालयों में से किसी की भी सिफारिश नहीं कर सकता क्योंकि उनमें एक या दूसरे तरीके की कमी है। मैंने तब से एक पैकेज रखा है जो (मेरा मानना ​​है कि) सुंदर HTTP सर्वर समाप्ति से अपेक्षित सभी मामलों को संभाल रहा है।

https://github.com/gajus/http-terminator

Http- टर्मिनेटर का मुख्य लाभ यह है कि:

  • यह बंदर-पैच Node.js एपीआई नहीं करता है
  • यह तुरंत एक संलग्न HTTP अनुरोध के बिना सभी सॉकेट को नष्ट कर देता है
  • यह चल रहे HTTP अनुरोधों के साथ सॉकेट्स को सुशोभित करने की अनुमति देता है
  • यह HTTPS कनेक्शन को ठीक से संभालता है
  • यह कनेक्शन को जीवित रखने का उपयोग करके कनेक्शन को सूचित करता है कि सर्वर कनेक्शन बंद करके बंद कर रहा है: शीर्ष लेख
  • यह Node.js प्रक्रिया को समाप्त नहीं करता है

Express.js के साथ उपयोग:

import express from 'express';
import {
  createHttpTerminator,
} from 'http-terminator';

const app = express();

const server = app.listen();

const httpTerminator = createHttpTerminator({
  server,
});

await httpTerminator.terminate();


-1

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

मैं अपनी पूरी निरंतर तैनाती प्रक्रिया के लिए ऐसी लिपियों का उपयोग करता हूं। इस पर कुछ अंतर्दृष्टि के लिए आपको जॉन रोहन के डेड सिंपल गेट वर्कफ्लो को देखना चाहिए ।


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

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

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

आप अपने परीक्षण कोड को अपने आप को bash में नहीं रखेंगे। आप बस सर्वर को शुरू करेंगे और स्क्रिप्ट से परीक्षण चलाएंगे, जैसे आप कमांड लाइन पर खुद करेंगे। वहाँ कोई वास्तविक विशेष जादू है।
जोश स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.