2013-02-16 22 views
6

में एक्सप्रेस के साथ क्वेरीस्ट्रिंग के साथ पूर्व-रूटिंग, मैं कुछ नियमों को सेट करने और वास्तविक रूटिंग होने से पहले कोड के छोटे टुकड़े को निष्पादित करने के मामले में क्वेरीस्ट्रिंग को पार्स करने के लिए एक्सप्रेस का उपयोग करने का प्रयास कर रहा हूं। उपयोग-मामला एक निश्चित मूल्य को पकड़ना है, जिसे सेट किया जा सकता है, किस लिंक का उपयोग किया जा रहा है। मैं अगली() का उपयोग कर अगले संभावित नियम में सामग्री को पास करने के लिए एक्सप्रेस 'कार्यक्षमता का उपयोग करता हूं।नोड जेएस

अब तक, मैंने कोशिश की - सभी app.get/उत्तर नियम-ब्लॉक के शीर्ष पर:

app.get('[?&]something=([^&#]*)', function(req, res, next) { 
    var somethingID = req.params.something; 
    // Below line is just there to illustrate that it's working. Actual code will do something real, of course. 
    console.log("Something: "+somethingID); 
    next(); 
}) 

app.get('/', site.index); 

और यह भी:

app.param('something', function(req, res, next) { 
    var somethingID = req.params.something; 
    console.log("Something: "+somethingID); 
    next(); 
}) 

app.get('/', site.index); 

क्या शुरू हो जाना चाहिए का उदाहरण :

URL: www.example.com/?something=10239 
URL: www.example.com/superpage/?something=10239 
URL: www.example.com/minisite/?anything=10&something=10239 

दुर्भाग्य से, मेरी समाधान में से कोई भी वास्तव में काम किया, और जो कुछ होता है, कि अगले मिलान शासन शुरू हो रहा है, लेकिन उपरोक्त छोटे कार्य को कभी निष्पादित नहीं किया जाता है। किसी के पास कोई विचार है, यह कैसे किया जा सकता है?

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

मैं यह भी समझता हूं, कि तर्क का तात्पर्य है कि एक्सप्रेस क्वेरीस्ट्रिंग को अनदेखा करता है और यह सामान्यतः पहले से ही रूटिंग के बाद एक फ़ंक्शन के भीतर पार्स किया गया है। लेकिन जैसा कि बताया गया है, मुझे इसे "मार्ग-अज्ञेयवादी" होने की आवश्यकता है और इस एप्लिकेशन के भीतर संसाधित किए गए किसी भी URL के साथ काम करना चाहिए।

उत्तर

21

express क्वेरी स्ट्रिंग के आधार पर रूट करने के लिए आप की अनुमति नहीं है। यदि आप प्रासंगिक पैरामीटर मौजूद हैं तो आप कुछ मिडलवेयर जोड़ सकते हैं जो कुछ ऑपरेशन करता है;

app.use(function (req, res, next) { 
    if (req.query.something) { 
     // Do something; call next() when done. 
    } else { 
     next(); 
    } 
}); 

app.get('/someroute', function (req, res, next) { 
    // Assume your query params have been processed 
}); 
+3

यह मेरे स्वयं के समाधान से अधिक सुरुचिपूर्ण और मान्य है। बहुत बहुत धन्यवाद। – lucorlis

1

ठीक है, यहां काफी तार्किक दोष है। राउटिंग केवल यूआरएल का उपयोग करता है, और क्वेरीस्ट्रिंग को अनदेखा करता है।

(या बेहतर 'ए') समाधान वास्तव में यह है:

app.get('*', function(req, res, next) { 
    if (req.query.something) { 
    console.log("Something: "+req.query.something); 
    }; 
    next(); 
}) 

स्पष्टीकरण: एक्सप्रेस मार्ग के लिए क्वेरी स्ट्रिंग, मिलान सभी यूआरएल है "*" केवल नियमित अभिव्यक्ति अनदेखी जाता है। एक बार यह ट्रिगर हो जाने पर, मैं जांच सकता हूं कि क्वेरीस्ट्रिंग मौजूद है या नहीं, मेरा तर्क करें और "अगले()" का उपयोग कर अगले नियम से मेल खाने वाले रूटिंग को जारी रखें।

और हाँ: facepalm

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