2012-10-04 6 views
7

बनाने के लिए विंडोज़ पर नोडजेएस पर path.join का उपयोग करना मेरे पास एक यूआरएल के दो गतिशील टुकड़े हैं जिन्हें मैं एक पूर्ण यूआरएल बनाने के लिए एक साथ जुड़ने की कोशिश कर रहा हूं। चूंकि मुझे सटीक तारों को नहीं पता है, मैं शामिल हो जाऊंगा, मैं "http://www.mysite.com/friends//12334.html" जैसे स्ट्रिंग-जॉइनिंग त्रुटियों से बचने के लिए पथ-जुड़ने वाली लाइब्रेरी का उपयोग करना चाहता हूं, जिसमें अतिरिक्त स्लैश, आदियूआरएल

मैं एक पर काम कर रहा हूं विंडोज 7 होम कंप्यूटर Node.js. का उपयोग कर

मैंने path लाइब्रेरी के path.join(...) का उपयोग करने का प्रयास किया, लेकिन क्योंकि मैं विंडोज़ पर हूं, यह सभी आगे की ओर धीमा हो गया है, जो कि यूआरएल के लिए स्पष्ट रूप से गलत है। उदाहरण:

var path = require('path'), 
    joined = path.join('http://www.mysite.com/', '/friends/family'); 

console.log(joined); 
// Prints: 
// http:\www.miserable.com\friends\family 

विंडोज पर एक यूआरएल के टुकड़ों में शामिल होने के लिए मैं किस कार्य या पुस्तकालय का उपयोग कर सकता हूं? वैकल्पिक रूप से, मैं विंडोज़ की बजाय यूनिक्स-शैली विभाजक को मजबूर करने के लिए path.join कैसे प्राप्त कर सकता हूं?

उत्तर

4

यूआरएल फाइल सिस्टम पथ नहीं हैं, इसलिए path में कुछ भी आपकी आवश्यकताओं के लिए लागू नहीं है। मैं url.resolve() का उपयोग करने का सुझाव दूंगा यदि यह आपकी आवश्यकताओं को पूरा करता है, या url.format() यदि नहीं है। ध्यान दें कि आप या तो अपने कोड में path.join() के लिए प्रतिस्थापित नहीं कर सकते हैं, क्योंकि उन्हें विभिन्न तर्कों की आवश्यकता होती है। दस्तावेज़ीकरण सावधानी से पढ़ें।

+0

आह, धन्यवाद। मैं 'यूआरएल' मॉड्यूल के बारे में जानता था लेकिन मुझे एहसास नहीं हुआ कि 'url.resolve' यूआरएल के साथ मिल जाएगा। मैंने सोचा कि 'पथ' अगला सबसे अच्छा विकल्प हो सकता है। – jdotjdot

+1

बुद्धिमानी के लिए एक शब्द url.resolve path.join के लिए प्रतिस्थापन में ड्रॉप नहीं है लेकिन URL के लिए है। इसके बजाय इसे "एक आधार यूआरएल, और एक href यूआरएल लें, और एक ब्राउज़र के रूप में उन्हें एक एंकर टैग के लिए हल करें।" विशेष रूप से ध्यान दें कि यदि आप इसे "http://example.com/one" और "दो" देते हैं तो यह आपको "http://example.com/two" और नहीं "http://example.com/one/ दो" –

2

url.resolve नहीं है क्या मैंने सोचा कि यह पहली नजर में होगा ... गौर करें कि dir1 2 उदाहरण में गिरा दिया जाता है

url.resolve('/one/two/three', 'four')   // '/one/two/four' 
url.resolve('http://domain.com/dir1', 'dir2'); // 'http://domain.com/dir2 (dir1 is gone!) 

यहाँ एक सरल में शामिल होने के विधि मैंने लिखा है:

var _s = require('underscore.string'); 
    /** 
    * Joins part1 and part2 with optional separator (defaults to '/'), 
    * and adds the optional prefix to part1 if specified 
    * 
    * @param {string} part1 
    * @param {string} part2 
    * @param {string} [separator] - defaults to '/' 
    * @param {string} [prefix] - defaults to empty... pass in "http://" for urls if part1 might not already have it. 
    * @returns {string} 
    */ 
    exports.joinWith = function(part1, part2, separator, prefix) { 
     var join = ""; 
     var separatorsFound = 0; 

     if(!separator) { separator = "/"; } 
     if(!prefix) { prefix = ""; } 

     if(_s.endsWith(part1, separator)) { separatorsFound += 1; } 
     if(_s.startsWith(part2, separator)) { separatorsFound += 1; } 

     // See if we need to add a join separator or remove one (if both have it already) 
     if(separatorsFound === 0) { join = separator; } 
     else if(separatorsFound === 2) { part1 = part1.substr(0, part1.length - separator.length); } 

     // Check if prefix is already set 
     if(_s.startsWith(part1, prefix)) { prefix = ""; } 

     return prefix + part1 + join + part2; 
    } 

नमूना:

// TEST 
console.log(exports.joinWith('../something', 'else')); 
console.log(exports.joinWith('../something/', 'else')); 

console.log(exports.joinWith('something', 'else', "-")); 
console.log(exports.joinWith('something', 'up', "-is-")); 
console.log(exports.joinWith('something-is-', 'up', "-is-")); 

console.log(exports.joinWith('../something/', '/else')); 
console.log(exports.joinWith('../something/', '/else', "/")); 
console.log(exports.joinWith('somedomain.com', '/somepath', "/")); 
console.log(exports.joinWith('somedomain.com', '/somepath', "/", "http://")); 

console.log(exports.joinWith('', '/somepath', "/")); 

उत्पादन:

../something/else 
../something/else 
something-else 
something-is-up 
something-is-up 
../something/else 
../something/else 
somedomain.com/somepath 
http://somedomain.com/somepath 
/somepath