2012-07-11 15 views
5

होमवर्क किया:यूआरएल मार्ग

The Node Beginner Book

How do I get started with Node.js [closed]

Structuring handlers in Node

Backstory: मैं कोशिश करते हैं और अपने खुद के ढांचे लिखना चाहते थे, लेकिन मैं कुछ मुसीबतों में चल रहा हूँ , पूरी तरह से इसे समझने की वजह से सबसे अधिक संभावना है।

var app = require('./app'); //this part is understood and it works in my current code. 
app.get('/someUrl', function(){ //do stuff here }); 
app.post('/someOtherUrl', function(){ //do stuff here }); 

मैं एक्सप्रेस-ढांचे यह एक ही वाक्य रचना है, लेकिन उनके स्रोत कोड को पढ़ने अभी भी मुझे eludes इस बात का पता है:

क्या मैं हासिल करना चाहते हैं एक वाक्य रचना है कि इस तरह दिखता है।

यह हासिल करने के लिए एक छोटा सा काम हो सकता है लेकिन मैं इसे अभी भी उत्पादित नहीं कर सकता हूं।

एप्लिकेशन में गहरी फ़ाइल में require('./app'); पर प्रयास करने के लिए एक अपरिभाषित ऑब्जेक्ट उत्पन्न करता है, इसलिए मुझे लगता है कि एक सर्वर एक सिंगलटन ऑब्जेक्ट है।

तो मैंने क्या प्रयास किया है?

मेरा वर्तमान कोड इस तरह दिखता है, और किसी भी तरह मुझे ऐसा लगता है कि यह जाने का तरीका है, लेकिन मैं स्पष्ट रूप से ऐसा नहीं कर सकता।

मैं इसे अधिक पढ़ने योग्य रखने के लिए सभी require(); कथन छोड़ रहा हूं।

server.js:

var app = module.exports = { 
    preProcess: function onRequest(request, response){ 
     processor.preRequest(request); //this object adds methods on the request object 
     var path = urllib.parse(request.url).pathname; 
     router.route(urls, path, request, response); 
    }, 
    createServer: function() { 
     console.log("Server start up done."); 
     return this.server = http.createServer(this.preProcess); 
    } 
}; 

exports.app = app; 

लेखन मैं एक get() विधि के साथ इस वस्तु को विस्तार के साथ प्रयोग कर रहा हूँ के समय।

index.js:

var app = require('./server'); 
app.createServer().listen('1337'); 

router.route() बिट मूल रूप से अनुरोध आगे आवेदन में भेजता है और router.js-फाइल के अंदर मैं एक समारोह के नक्शे कि के लिए आगे अनुरोध कुछ जादू और मार्ग करना (अब तक)/urlThatWasRequested

यह वह व्यवहार है जिसे मैं पीछे छोड़ना चाहता हूं। मुझे पता है कि यह एक बहुत लंबा आदेश हो सकता है लेकिन मेरा सभी कोड आसानी से त्याग दिया जा सकता है और मुझे पूरे कोडबेस को फिर से लिखने से डर नहीं है क्योंकि यह मेरा स्वयं का प्रोजेक्ट है।

मुझे आशा है कि यह मेरे प्रश्न को अन्यथा समझाने में पर्याप्त है, कृपया यह कहें कि इसे थोड़ा और स्पष्ट करने के लिए मुझे क्या जोड़ना चाहिए।

अग्रिम धन्यवाद!

1) आप एक परिपत्र संदर्भ यहाँ पैदा कर रहे:

var app = module.exports = { 
    // some other code 
} 
exports.app = app; 

आप की एक संपत्ति के रूप में app जोड़ने

उत्तर

11

मैं बिल्कुल यकीन है कि आपका प्रश्न क्या है नहीं कर रहा हूँ, लेकिन यहाँ कुछ विचार है app। अंतिम पंक्ति की कोई ज़रूरत नहीं है।

2) आपको app में हैंडलर रखने की आवश्यकता है। इस तरह से if (handler.url == path) कि handler.url एक रेगुलर एक्सप्रेशन है और आप इसके खिलाफ path का परीक्षण:

var app = module.exports = { 
    handlers : [], 
    route : function(url, fn) { 
     this.handlers.push({ url: url, fn: fn }); 
    }, 
    preProcess: function onRequest(request, response){ 
     processor.preRequest(request); 
     var path = urllib.parse(request.url).pathname; 
     var l = this.handlers.length, handler; 
     for (var i = 0; i < l; i++) { 
      handler = this.handlers[i]; 
      if (handler.url == path) 
       return handler.fn(request, response); 
     } 
     throw new Error('404 - route does not exist!'); 
    }, 
    // some other code 
} 

ध्यान दें कि आप इस लाइन को बदल सकता है: आप कुछ इस तरह की कोशिश कर सकते हैं। बेशक आप .get और .post प्रकारों को लागू कर सकते हैं, लेकिन मेरे अनुभव से यह जांचना आसान है कि अनुरोध GET या POSTहैंडलर के अंदर है। अब आप इस तरह से ऊपर कोड का उपयोग कर सकते हैं:

app.route('/someUrl', function(req, res){ //do stuff here }); 

अन्य बात यह है कि कोड मैं तुम्हें दिखाया है केवल एक दिए गए URL यह मैच के लिए पहले हैंडलर सक्रिय करता है। आप शायद कई हैंडलर (यानी मिडवेयर) से जुड़े अधिक जटिल मार्ग बनाना चाहते हैं। वास्तुकला, उस मामले में थोड़ा अलग होगा उदाहरण के लिए:

preProcess: function onRequest(request, response){ 
    var self = this; 
    processor.preRequest(request); 
    var path = urllib.parse(request.url).pathname; 
    var l = self.handlers.length, 
     index = 0, 
     handler; 
    var call_handler = function() { 
     var matched_handler; 
     while (index < l) { 
      handler = self.handlers[index]; 
      if (handler.url == path) { 
       matched_handler = handler; 
       break; 
      } 
      index++; 
     } 
     if (matched_handler) 
      matched_handler.fn(request, response, function() { 
       // Use process.nextTick to make it a bit more scalable. 
       process.nextTick(call_handler); 
      }); 
     else 
      throw new Error('404: no route matching URL!'); 
    }; 
    call_handler(); 
}, 

अब आप अपने मार्ग के अंदर आप

app.route('/someUrl', function(req, res, next){ 
    //do stuff here 
    next(); // <--- this will take you to the next handler 
}); 

उपयोग कर सकते हैं जो एक और हैंडलर के लिए ले (या अपवाद होगा अगर कोई हैं अधिक हैंडलर)।

3) इन शब्दों के बारे में:

'./ एप्लिकेशन') की आवश्यकता होती है (कोशिश कर रहा है; एप्लिकेशन में गहरी फ़ाइल में एक अपरिभाषित ऑब्जेक्ट उत्पन्न होता है, इसलिए मुझे लगता है कि एक सर्वर एक सिंगलटन ऑब्जेक्ट है।

यह सच नहीं है। require हमेशा मॉड्यूल ऑब्जेक्ट का संदर्भ देता है। यदि आप undefined देखते हैं, तो आपने कुछ और गड़बड़ कर दिया है (मॉड्यूल को स्वयं बदल दिया है?)।

अंतिम नोट: मुझे आशा है कि इससे थोड़ा सा मदद मिलेगी। अपना खुद का ढांचा लिखना मुश्किल काम हो सकता है, खासकर जब से पहले से ही एक्स्प्रेसेंट फ्रेमवर्क जैसे एक्सप्रेस हैं। हालांकि शुभकामनाएँ!

संपादित

.get और .set तरीकों को लागू करने वास्तव में मुश्किल नहीं है। इसके बाद एल्गोरिथ्म मार्ग में आप जाँच करें कि क्या type संपत्ति परिभाषित किया गया है

route : function(url, fn, type) { 
    this.handlers.push({ url: url, fn: fn, type: type }); 
}, 
get : function(url, fn) { 
    this.route(url, fn, 'GET'); 
}, 
post : function(url, fn) { 
    this.route(url, fn, 'POST'); 
}, 

और: तुम बस को बदलने के लिए इस तरह route समारोह की जरूरत है।यदि ऐसा नहीं है तो उस मार्ग का उपयोग करें (undefined प्रकार का अर्थ है: हमेशा मार्ग)। अन्यथा अतिरिक्त रूप से जांच करें कि अनुरोध की विधि किस प्रकार मेल खाती है। और आपने कल लिया!

+0

उत्तर के लिए धन्यवाद! :) मेरा सवाल था "एक .get(), .post() वाक्यविन्यास कैसे उत्पन्न करें"। मुझे सवाल बदलना पड़ सकता है। इस परियोजना में वरीयता के कारण मैं खुद ही कार्य में प्राप्त/पोस्ट की जांच करने से बचना चाहता हूं। मुझे सही दिशा बताने के लिए धन्यवाद! :) इसके अलावा मेरे पास एक हैंडलर-फ़ाइल है जहां मैं बहुत सारे हैंडलर जोड़ता हूं जो एक ही नाम से फ़ंक्शंस में मैप करते हैं, मुझे यकीन नहीं है कि यह स्पष्ट किया गया है या नहीं। –

+0

@limelights मैं देखता हूं। मैंने जवाब अपडेट कर लिया है! – freakish

+0

यह एक पूरी तरह से मूर्ख सवाल हो सकता है लेकिन हैंडलर संपत्ति स्थापित नहीं है, यह सिर्फ अपरिभाषित है। –

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