नोड-एक्सप्रेस सर्वर को ठीक से कैसे बंद करें?


84

मुझे /auth/github/callback url से कॉलबैक प्राप्त करने के बाद सर्वर को बंद करने की आवश्यकता है । सामान्य HTTP एपीआई समापन सर्वर के साथ वर्तमान में server.close([callback]) एपीआई फ़ंक्शन के साथ समर्थन कर रहा है , लेकिन नोड-एक्सप्रेस सर्वर के साथ मुझे TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close' त्रुटि हो रही है। और मुझे नहीं पता कि इस समस्या को हल करने के लिए जानकारी कैसे प्राप्त करें।
मुझे एक्सप्रेस सर्वर कैसे बंद करना चाहिए?

NodeJS कॉन्फ़िगरेशन नोट:

$ node --version
v0.8.17
$ npm --version
1.2.0
$ npm view express version
3.0.6

वास्तविक आवेदन कोड:

var app = express();

// configure Express
app.configure(function() {
    // … configuration
});

app.get(
    '/auth/github/callback',
    passport.authenticate('github', { failureRedirect: '/login' }),
    function(req, res) {
        res.redirect('/');

        setTimeout(function () {
            app.close();
            // TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close'
        }, 3000)
    }
);

app.listen('http://localhost:5000/');

इसके अलावा, मैं ने पाया है 'NodeJS पास व्यक्त ...' लेकिन मुझे यकीन है कि मैं अगर मैं कोड के साथ उपयोग कर सकते हैं नहीं है: var app = express();

जवाबों:


115

app.listen()लौटता है http.Server। आपको close()उस उदाहरण पर आह्वान करना चाहिए और appउदाहरण पर नहीं ।

पूर्व।

app.get(
    '/auth/github/callback',
    passport.authenticate('github', { failureRedirect: '/login' }),
    function(req, res) {
        res.redirect('/');

        setTimeout(function () {
            server.close();
            // ^^^^^^^^^^^
        }, 3000)
    }
);

var server = app.listen('http://localhost:5000/');

आप स्रोतों का निरीक्षण कर सकते हैं: /node_modules/express/lib/application.js


4
अजीब है, अगर मैं कुछ मार्ग का उपयोग करता हूं तो यह बंद नहीं होता है।
उदय हिरवाले

1
@ उदय, मैंने भी इसका अनुभव किया। मुझे पता चला कि मेरे ब्राउज़र में HTTP1.1 लगातार कनेक्शन खुला था, इसलिए जब मैंने F5 दबाया तो यह दिखाई दिया जैसे कि सर्वर बंद नहीं हुआ था। यदि आप एक अलग ब्राउज़र की कोशिश करते हैं, तो आप देखेंगे कि सर्वर सॉकेट नहीं चल रहा है।
रिक वेलडे

वह मेरी गलती थी, मैं appबदले में पास बुला रहा था server। मेरा दिन बचा लिया। बहुत धन्यवाद 19
एडिसन स्पेंसर

48

एक्सप्रेस v3 में उन्होंने इस फंक्शन को हटा दिया।

आप अभी भी app.listen()फ़ंक्शन का परिणाम बताकर इसे प्राप्त कर सकते हैं और उस पर करीब लागू कर सकते हैं:

var server = app.listen(3000);
server.close()

https://github.com/visionmedia/express/issues/1366


मामले में सर्वर की समाप्ति सुनिश्चित करने के लिए github.com/gajus/http-terminator जैसी किसी चीज़ का उपयोग करें यदि लगातार कनेक्शन या अनुरोध एक प्रतिक्रिया उत्पन्न नहीं कर रहे हैं।
गजस २०'२०

संक्षिप्त और सरल
कृपांक अनादकट

4

अगर आपके एक्सप्रेस ऐप में कोई त्रुटि होती है तो आपको सर्वर बंद करना होगा और आप इसे नीचे की तरह कर सकते हैं-

var app = express();
var server = app.listen(process.env.PORT || 5000)

यदि कोई त्रुटि होती है तो हमारे आवेदन को नाम का संकेत मिलेगा SIGTERM

आप नोड सिग्नल के बारे में अधिक यहाँ पढ़ सकते हैं-

https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html

process.on('SIGTERM', () => {
  console.info('SIGTERM signal received.');
  console.log('Closing http server.');
  server.close(() => {
    console.log('Http server closed.');
  });
});

क्षमा करें, इसका प्रासंगिक नहीं है। प्रश्न मैनुअल सर्वर शटडाउन के बारे में है और त्रुटि से निपटने के बारे में नहीं है
व्लादिमीर स्टार्कोव

1

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

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

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

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

उत्तर के लिए धन्यवाद, लेकिन यह सवाल 7 साल पुराना है
व्लादिमीर स्टार्कोव

7
यह एक वैध प्रश्न बना हुआ है।
गजस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.