2014-09-02 5 views
8

में app.listen की कार्यक्षमता को कैसे अधिभारित कर सकता हूं, मैं एक फैक्ट्री फ़ंक्शन (मूल रूप से) बनाने की कोशिश कर रहा हूं जो एक दर्जन छोटे विशेष सर्वरों के लिए एक एक्सप्रेसजे सर्वर को कॉन्फ़िगर और बनाता है। इसके हिस्से के लिए मैं श्रवण समारोह में वृद्धि करना चाहता हूं।मैं एक्सप्रेसजेस

मैं इस बारे में जाने का सबसे अच्छा तरीका जानना चाहता हूं। मैं यहां एक पुन: प्रयोज्य डिजाइन विकल्प की भी तलाश कर रहा हूं।

सर्वर सामान्य रूप से बनाई गई है:

var httpServer = express(); 
    ... 

जिस तरह से एक्सप्रेस डिज़ाइन किया गया है (सुनिश्चित नहीं हैं कि अगर मैं सही हूँ) की मैं एक {} जो कुछ .prototype.listen उपयोग नहीं कर सकते। तो मैं दो दृष्टिकोण के साथ आया हूँ।

वर्तमान क्षेत्र में एक अतिरिक्त चर का उपयोग करना:

var oldListen = httpServer.listen; 
httpServer.listen = function(callback){ 
    ... 
    oldListen.call(httpServer, options.port, options.host, function(){ 
     ... 
     if (typeof callback == 'function') callback();      
    }); 
}; 

कौन सा काम करता है और काफी सीधे आगे है लेकिन फिर मैं एक चर उत्थापन मस्सा है। मैं भी एक बंद समाधान है, लेकिन मुझे लगता है कि यह बहुत व्यावहारिक होने के लिए कुंठित हो सकता है:

httpServer.listen = (function(superListen){ 
    return function(callback){ 
     ... 
     superListen.call(httpServer, options.port, options.host, function(){ 
     ...    
     if (typeof callback == 'function') callback(); 
     }); 
    };            
})(httpServer.listen); 

दोनों उदाहरण कारखाने संदर्भ का हिस्सा हैं और मैं जानबूझकर तर्क समारोह के लिए पारित को कम करने कर रहा हूँ।

किसी भी मदद की सराहना की जाएगी।

+0

एक्सप्रेस मिडलवेयर ऑर्डर पर निर्भर करता है, इसलिए फैक्ट्री फ़ंक्शन शायद आपको काटने जा रहा है। आप प्रत्येक ऐप में कम चीजों की आवश्यकता के लिए मिडलवेयर लिख सकते हैं https://gist.github.com/aj0strow/b0a1232d2f0df54e1a13 – AJcodez

उत्तर

1

आपको एक्सप्रेस श्रवण फ़ंक्शन को आसानी से अधिभारित करने में सक्षम होना चाहिए। आप नीचे दिए गए ऑब्जेक्ट पथ में इसे का उपयोग कर सकते हैं: express.application.listen

तो, आप कुछ इस तरह लागू कर सकते हैं:

var express = require('express'); 

express.application.baseListen = express.application.listen; 
express.application.listen = function(port) { 
console.log('Port is: ' + port); 
    this.baseListen(port); 
}; 

सुनने समारोह के कार्यान्वयन एक्सप्रेस मॉड्यूल फ़ोल्डर के अंतर्गत निम्नलिखित रास्ते में है: node_modules\express\lib\application.js

-1

दिए गए होस्ट और पोर्ट पर कनेक्शन ढूंढें और सुनें। यह विधि नोड के http.Server # सुनो() के समान है।

var express = require('express'); 
var app = express(); 
app.listen(3000); 

एप्लिकेशन एक्सप्रेस द्वारा दिया() वास्तव में एक जावास्क्रिप्ट समारोह, एक कॉलबैक अनुरोधों को हैंडल करने के रूप में नोड के HTTP सर्वर को पास करने के लिए डिज़ाइन है।

var express = require('express'); 
var https = require('https'); 
var http = require('http'); 
var app = express(); 

http.createServer(app).listen(80); 
https.createServer(options, app).listen(443); 

app.listen() विधि है: यह आप आसानी से, एक ही codebase आपके ऐप के दोनों HTTP और HTTPS संस्करण प्रदान करने के लिए एप्लिकेशन के रूप में इन से विरासत नहीं करता है (यह सिर्फ एक कॉलबैक है) की अनुमति देता है निम्नलिखित के लिए एक सुविधा विधि (आप HTTPS का उपयोग या दोनों प्रदान करने के लिए चाहते हैं, तकनीक से ऊपर का उपयोग करें):

app.listen = function(){ 
var server = http.createServer(this); 
return server.listen.apply(server, arguments); 
}; 

संदर्भ: http://expressjs.com/api.html

आशा है कि यह मदद करता है।

2

यदि आप "ओवरलोडिंग" पर जोर देते हैं, तो सुनिश्चित करें कि आप मूल पदचिह्न (जैसे ओवरलोडिंग की प्रकृति) लागू करते हैं।एक्सप्रेस listen सिर्फ नोड के internal http listen method करने के लिए एक अन्य नाम है:

server.listen(port, [host], [backlog], [callback]); 

अद्यतन: एक्सप्रेस भी कस्टम कार्यान्वयन के लिए नोड के सर्वर एपीआई का उपयोग कर पता चलता है: अन्यथा http://expressjs.com/4x/api.html#app.listen

, आप अपने स्वयं के कस्टम listen विधि बनाना चाहिए जो होगा

httpServer.myCustomListen = function (callback) { 
    httpServer.listen.call(httpServer, options.port, options.host, callback); 
} 

दूसरा विकल्प अपने सबसे अच्छे शर्त है, लेकिन इसे काम करने के लिए, आप expre का विस्तार करना होगा: की तरह परिभाषित किया गया एसएस पुस्तकालय एक्सप्रेस ओपन सोर्स है और गिथब पर होस्ट किया गया है। इसे फोर्क करें और कृपया इसे संशोधित करें। नए अपडेट में समय-समय पर pull ताकि आप कोर लाइब्रेरी के साथ अद्यतित रह सकें। मैं यह हर समय नोड मॉड्यूल के साथ करता हूँ।

  1. आप कोड अनुकूलित करने के लिए लेकिन आप फिट देख जबकि मूल लेखकों द्वारा लिखी कोड के साथ तारीख तक रहने पूरा नियंत्रण है:

    इसे इस तरह करने से दो फायदे होते हैं।

  2. यदि आपको कोई बग मिलती है या एक शानदार सुविधा बनाएं, तो आप बड़े पैमाने पर समुदाय को लाभ पहुंचाने के लिए एक पुल अनुरोध सबमिट कर सकते हैं।

आप पहले भंडार कांटा होता है, तो, अपने कांटा के लिए URL हड़पने क्लोन यह, और फिर मूल "नदी के ऊपर" रेपो के लिए एक संदर्भ जोड़ें: आप कर सकते हैं

git clone [url_to your_fork] 
cd express 
git remote add upstream [email protected]:strongloop/express.git 

फिर अपने खुद के रेपो में परिवर्तन धक्का (git push)। यदि आप मूल रेपो से अपडेट प्राप्त करना चाहते हैं, तो आप अपस्ट्रीम रेपो से खींच सकते हैं: git pull upstream master

आप एक परियोजना के लिए एक NPM मॉड्यूल के रूप में व्यक्त की कस्टम कांटा जोड़ना चाहते हैं, तो आपको निम्न का प्रयोग करेंगे:

npm install git://github.com/[your_user_name]/express.git --save 
2

के रूप में विक्टर के जवाब में बताया, एक्सप्रेस के प्रोटोटाइप express/lib/application.js में है। उस फ़ाइल का उपयोग एक्सप्रेस बनाने के लिए किया जाता है और नामस्थान के माध्यम से express/lib/express.js में निर्यात किया जाता है। इसलिए, .listen फ़ंक्शन को express.appliction.listen का उपयोग करके संदर्भित किया जा सकता है। (विक्टर की विधि के समान)

var express = require('express'); 

express.application._listen = express.application.listen; 
express.application.listen = function(callback) { 
    return this._listen(options.port, options.host, callback); 
}; 

एक भी लो-पानी का छींटा के _.wrap समारोह का उपयोग कर सकते हैं यदि आप एक चर अपने आप में आधार समारोह स्टोर करने के लिए नहीं करना चाहती:

एक इस विधि तो उपयोग कर सकते हैं। यह कुछ इस तरह दिखेगा:

var express = require('express'); 
var _ = require('lodash'); 

express.application.listen = _.wrap(express.application.listen, function(listenFn) { 
    return listenFn(options.port, options.host, callback); // Called with the same this 
}; 

हालांकि, (, चर उत्थापन एक अतिरिक्त वैरिएबल बनाने से) इन तरीकों का उपयोग कर समस्याओं है कि आप अपने प्रश्न में आपका उल्लेख में चलाने होगा। इसे हल करने के लिए, मैं आमतौर पर express.application का अपना उप-वर्ग बनाउंगा और उस सबक्लास में .listen फ़ंक्शन को प्रतिस्थापित करता हूं और इसके बजाय उस सबक्लास का उपयोग करने के लिए व्यक्त करता हूं। एक्सप्रेस की वर्तमान संरचना के कारण, आप को अपने स्वयं के सबक्लास के साथ express() फ़ंक्शन को ओवरराइड किए बिना प्रतिस्थापित नहीं कर सकते हैं।

इसलिए, मैं क्या करूँगा express.application.listen पूरी तरह से लेना क्योंकि यह केवल 2 लाइनें है। यह इतना आसान है!

var express = require('express'); 
var http = require('http'); 

express.application.listen = function(callback) { 
    return http.createServer(this).listen(options.port, options.host, callback); 
}; 

आप एक https विकल्प भी बना सकते हैं!

var express = require('express'); 
var http = require('http'); 
var https = require('https'); 

express.application.listen = function(callback) { 
    return (options.https ? http.createServer(this) : https.createServer({ ... }, this)) 
      .listen(options.port, options.host, callback); 
}; 

नोट: अन्य उत्तरों में से एक ने अभिव्यक्त करने और इसे संशोधित करने का उल्लेख किया है। मुझे इतना कठिन समय होगा कि इस तरह के एक छोटे से काम के लिए।