express.js - एक ही लाइन में कई मार्गों के लिए एकल रूटिंग हैंडलर


108

क्या किसी एकल फ़ंक्शन कॉल पर इसे बनाने का कोई तरीका है?

var todo = function (req, res){};

app.get("/", todo);
app.get("/blabla", todo);
app.get("/blablablabla", todo);

कुछ इस तरह:

app.get("/", "/blabla", "/blablablabla", todo );

मुझे पता है कि यह एक वाक्यविन्यास गड़बड़ है, लेकिन सिर्फ यह जानने के लिए कि मैं क्या हासिल करना चाहता हूं, मार्गों की एक सरणी भयानक होगी!

क्या कोई जानता है कि इसे कैसे करना है?


2
आपको एक नियमित अभिव्यक्ति लिखने में सक्षम होना चाहिए जो उन सभी मार्गों से मेल खाएगी जिन्हें आप टूडू के लिए रूट करना चाहते हैं, और अपने समापन बिंदु के रूप में नियमित अभिव्यक्ति का उपयोग करें। यह गड़बड़ हो सकता है, लेकिन यह काम करेगा। मैं इसे एक उत्तर के रूप में पोस्ट नहीं कर रहा हूं क्योंकि मुझे यकीन नहीं है कि नियमित अभिव्यक्ति क्या होगी, और यह उस दिशा में एक धक्का है। डॉक्स में नियमित अभिव्यक्ति का उपयोग करने का उल्लेख यहां है: expressjs.com/api.html#app.VERB
निक

मैं जे एस में regex के साथ अनुभव नहीं है ... बीमार यह एक कोशिश दे ... लेकिन किसी भी अन्य विकल्प का स्वागत है!
एरॉनिस मारियानो

1
मेरे पास या तो बहुत कुछ नहीं है, जो ईमानदारी से है कि मैंने इसे सिर्फ आपको क्यों नहीं दिया, हालांकि मेरी समझ यह है कि नियमित अभिव्यक्ति काफी सार्वभौमिक हैं; एक्सप्रेस को आपके भावों को किसी भी अन्य भाषा के समान ही समझना चाहिए।
निक मिचिनसन

1
नियमित अभिव्यक्ति बहुत शक्तिशाली है और निश्चित रूप से सीखने लायक है। यहाँ एक समाधान है: app.get (/ ^ \ / ((blabla) {0,2}) $ /, फ़ंक्शन (req, resp) {var मिलान किया गया = req.params [0]; प्रतिक्रिया ;सेट ('सामग्री-' टाइप ',' टेक्स्ट / प्लेन ') .send ("मिलान:" + मिलान + "" "}})); कुछ बातें: 1. regex की शुरुआत और अंत a / से होता है, इसलिए किसी भी / वर्ण से बचना होगा। 2. ^ चार स्ट्रिंग की शुरुआत से मेल खाता है, $ चार स्ट्रिंग के अंत से मेल खाता है। उनके बिना, मैच शुरू होने या रास्ते के अंत में बाहरी आकर्षण के साथ भी सफल होगा, अर्थात / x / blablaxxx
जॉन डेगन

जवाबों:


131

उसी कार्यक्षमता की तलाश में मैं इस सवाल पर आया।

@ जोनाथन ओंग ने ऊपर एक टिप्पणी में उल्लेख किया है कि रास्तों के लिए सरणियों का उपयोग किया जाता है, लेकिन इसे स्पष्ट रूप से एक्सप्रेस 4 में वर्णित किया गया है, और यह एक्सप्रेस 3.x में काम करता है। यहाँ कुछ करने की कोशिश करने का एक उदाहरण है:

app.get(
    ['/test', '/alternative', '/barcus*', '/farcus/:farcus/', '/hoop(|la|lapoo|lul)/poo'],
    function ( request, response ) {

    }
);

requestएक पथ के साथ वस्तु के अंदर से /hooplul/poo?bandle=froo&bandle=pee&bof=blarg:

"route": {
    "keys": [
        {
            "optional": false, 
            "name": "farcus"
        }
    ], 
    "callbacks": [
        null
    ], 
    "params": [
        null, 
        null, 
        "lul"
    ], 
    "regexp": {}, 
    "path": [
        "/test", 
        "/alternative", 
        "/barcus*", 
        "/farcus/:farcus/", 
        "/hoop(|la|lapoo|lul)/poo"
    ], 
    "method": "get"
}, 

ध्यान दें कि परमेस के साथ क्या होता है: यह सभी संभावित रास्तों में कैप्चर समूहों और परमों के बारे में जानता है, चाहे वे वर्तमान अनुरोध में उपयोग किए जाते हैं या नहीं।

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

संपादित करें: कृपया नीचे @ c24w का उत्तर भी देखें ।

संपादन 2: यह एक मध्यम लोकप्रिय उत्तर है। कृपया ध्यान रखें कि ExpressJS, अधिकांश Node.js पुस्तकालयों के साथ, एक जंगम दावत है। जबकि ऊपर राउटिंग अभी भी काम करता है (मैं इसे इस समय उपयोग कर रहा हूं, एक बहुत ही उपयोगी सुविधा), मैं अनुरोध ऑब्जेक्ट के आउटपुट के लिए वाउच नहीं कर सकता (यह निश्चित रूप से मेरे द्वारा वर्णित से अलग है)। कृपया वांछित परिणाम प्राप्त करने के लिए सावधानीपूर्वक परीक्षण करें।


एक जादू की तरह काम करता है। धन्यवाद।
OrAayayag

58
app.get('/:var(bla|blabla)?', todo)

:varसेट है req.paramकि आप का उपयोग नहीं करते हैं। यह केवल इस मामले में regex सेट करने के लिए उपयोग किया जाता है।

(bla|blabla)मैच के लिए रेगेक्स सेट करता है, इसलिए यह स्ट्रिंग्स से मेल खाता है blaऔर blablah

?पूरे रेगेक्स को वैकल्पिक बनाता है, इसलिए यह मेल /भी खाता है ।


1
/bla(bla)?यह भी काम करता है, लेकिन ठीक से पॉप्युलेट नहीं होने के बाद कोई भी पैरामीटर (यानी /bla(bla)?/:valueपॉप्युलेट नहीं होता req.params.value)। किसी को पता है क्यों?
जोंसरसन

यदि आपका उपयोग करने वाला एक्सप्रेस आप इसे प्राप्त कर सकता है, req.params.varलेकिन आपको यह सुनिश्चित करने की आवश्यकता है कि आप reqसमारोह में जा चुके हैं
मैट द निंजा

51

आप वास्तव में पथों की एक सरणी में पास कर सकते हैं , जैसे आपने उल्लेख किया है, और यह बहुत अच्छा काम करता है:

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);

28
इस पदावनत के लिए प्रतिस्थापन क्या है?
ब्रांडनस्क्रिप्ट 22

5
@JonathanOng आप कहते हैं कि यह पदावनत है, और रेमस पूछ रहा है कि प्रतिस्थापन क्या है। क्या आप उसके सवाल का जवाब दे सकते हैं?
nbro

राऊटर.ट्राउट (['/ मेलर / आउट / सिस्टम', '/ मेलर / आउट / पेमेंट')) एक्सप्रेस 4 में कोई ठीक से काम नहीं कर रहा है, कोई डेप्रिसिएशन चेतावनी नहीं है
danday74

2
@JonathanOng एक सरणी का उपयोग करते हुए वर्तमान एक्सप्रेस v4 डॉक्स को देखकर अपवित्र नहीं होता है।
जेसन एक्सलसन

32

केविन के जवाब पर विस्तार से बताने के लिए , यह 4.x डॉक्स से है :

वह मार्ग जिसके लिए मिडलवेयर फ़ंक्शन का उपयोग किया जाता है; इनमें से कोई भी हो सकता है:

  • पथ का प्रतिनिधित्व करने वाला एक तार।
  • एक पथ पैटर्न।
  • रास्तों का मिलान करने के लिए एक नियमित अभिव्यक्ति पैटर्न।
  • उपरोक्त में से किसी के संयोजन की एक सरणी।

उनके कुछ उदाहरण हैं , जिनमें शामिल हैं:

इस पथ के साथ शुरू से मेल खाएगी /abcd, /xyza, /lmn, और /pqr:

app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
  next();
});


-2

अपने मूल मार्ग की फ़ाइल की आवश्यकता है और इस तरह नए मार्ग को परिभाषित करें

var user = require('./users');
router.post('/login', user.post('/login'));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.