एक्सप्रेस-जेएस वाइल्डकार्ड मार्ग के तहत और सब कुछ कवर करने के लिए मार्ग


96

मैं एक मार्ग को शामिल करने की कोशिश कर रहा हूं /fooजिसमें सब कुछ शामिल /fooहै। मैंने कोशिश की है कि /foo*जो कुछ भी मैच नहीं करता है उसे छोड़कर किस काम का उपयोग करें /foo। का निरीक्षण करें:

var express = require("express"),
    app = express.createServer();

app.get("/foo*", function(req, res, next){
  res.write("Foo*\n");
  next();
});

app.get("/foo", function(req, res){
  res.end("Foo\n");
});

app.get("/foo/bar", function(req, res){
  res.end("Foo Bar\n");
});

app.listen(3000);

आउटपुट:

$ curl localhost:3000/foo
Foo
$ curl localhost:3000/foo/bar
Foo*
Foo Bar

मेरे विकल्प क्या हैं? सबसे अच्छा मैं साथ आया हूँ /fo*जो मार्ग के लिए निश्चित रूप से बहुत इष्टतम नहीं है क्योंकि यह रास्ता बहुत अधिक मेल खाता है।


यदि आपका अवरोधन सभी /foo*मार्गों की तरह है, तो क्या आप इसके बजाय इसे मिडलवेयर नहीं बनाना चाहते हैं?
रयूनोस

3
सावधान रहें कि आप क्या पूछते हैं: /foo*मैच /foo/barलेकिन यह भी मेल खाता है /foolishजो आपने संभवतः इरादा नहीं किया था।
व्य्क

जवाबों:


112

मुझे लगता है कि आपके पास 2 मार्ग होंगे। यदि आप कनेक्ट राऊटर की लाइन 331 को देखते हैं तो एक पथ में * को बदल दिया जाता है। + इसलिए 1 या अधिक वर्णों से मेल खाएगा।

https://github.com/senchalabs/connect/blob/master/lib/middleware/router.js

यदि आपके पास 2 मार्ग हैं जो एक ही क्रिया करते हैं तो आप इसे DRY रखने के लिए निम्न कार्य कर सकते हैं ।

var express = require("express"),
    app = express.createServer();

function fooRoute(req, res, next) {
  res.end("Foo Route\n");
}

app.get("/foo*", fooRoute);
app.get("/foo", fooRoute);

app.listen(3000);

103
app.get(["/foo", "/foo*"], /* function */);साथ ही अधिमान्य हो सकता है!
क्रिस फोस्टर

9
तार की एक सरणी में पास करना मेरे लिए भी बेहतर है। दुर्भाग्य से: app.VERB () के लिए एक सरणी गुजर रहा है और पदावनत किया जाएगा 4.0 में हटा दिया जाएगा
CodeWarrior

10
एक्सप्रेस 4.9.1 में तार की एक सरणी में पासिंग को बहाल किया गया है।
पीट टीएनटी

30

कनेक्ट राउटर को अब हटा दिया गया है ( https://github.com/senchalabs/connect/issues/262 ), लेखक ने कहा कि आपको रूटिंग के लिए कनेक्ट (जैसे एक्सप्रेस) के ऊपर एक फ्रेमवर्क का उपयोग करना चाहिए।

एक्सप्रेस वर्तमान में व्यवहार करता है app.get("/foo*") के रूप में app.get(/\/foo(.*)/)दो अलग-अलग मार्गों के लिए की जरूरत को हटाने। यह पिछले उत्तर के विपरीत है (अब हटाए गए कनेक्ट राउटर का जिक्र करते हुए) जिसमें कहा गया था कि " *एक पथ में बदल दिया गया है .+"।

अपडेट: एक्सप्रेस अब "पाथ-टू-रीजैक्सप" मॉड्यूल का उपयोग करता है (एक्सप्रेस 4.0.0 के बाद से) जो वर्तमान में संदर्भित संस्करण में समान व्यवहार रखता है । यह मेरे लिए स्पष्ट नहीं है कि क्या उस मॉड्यूल का नवीनतम संस्करण व्यवहार रखता है, लेकिन अभी के लिए यह उत्तर खड़ा है।


तो क्या हमें उपयोग करना चाहिए। + या *?
टायलर लैंगान

2
का प्रयोग करें /\/foo(.+)/आप मिलान करना चाहते हैं /fooएक या अधिक वर्ण द्वारा पीछा किया, और /foo*या /\/foo(.*)/आप मिलान करना चाहते हैं /fooशून्य या अधिक पात्रों द्वारा पीछा किया।
जोहान

12

दो मार्ग होना आवश्यक नहीं है।

बस (/*)?अपने pathस्ट्रिंग के अंत में जोड़ें ।

उदाहरण के लिए, app.get('/hello/world(/*)?' /* ... */)

यहां एक पूरी तरह से काम करने का उदाहरण है, इसे नोड के साथ चलाने के लिए एक .js फ़ाइल में कॉपी और पेस्ट करने के लिए स्वतंत्र महसूस करें, और इसके साथ एक ब्राउज़र (या कर्ल) में खेलें:

const app = require('express')()

// will be able to match all of the following
const test1 = 'http://localhost:3000/hello/world'
const test2 = 'http://localhost:3000/hello/world/'
const test3 = 'http://localhost:3000/hello/world/with/more/stuff'

// but fail at this one
const failTest = 'http://localhost:3000/foo/world'

app.get('/hello/world(/*)?', (req, res) => res.send(`
    This will match at example endpoints: <br><br>
    <pre><a href="${test1}">${test1}</a></pre>
    <pre><a href="${test2}">${test2}</a></pre>
    <pre><a href="${test3}">${test3}</a></pre>

    <br><br> Will NOT match at: <pre><a href="${failTest}">${failTest}</a></pre>
`))

app.listen(3000, () => console.log('Check this out in a browser at http://localhost:3000/hello/world!'))

9

सरणी में आप req.params को पास करने वाले चर का भी उपयोग कर सकते हैं:

app.get(["/:foo", "/:foo/:bar"], /* function */);

4

जो लोग नोड / एक्सप्रेस सीख रहे हैं (मेरे जैसे ही): यदि संभव हो तो वाइल्डकार्ड रूटिंग का उपयोग न करें!

मैं GET / users /: id / जो भी वाइल्डकार्ड रूटिंग का उपयोग कर रहा हूं, के लिए रूटिंग को लागू करना चाहता था। इस तरह से मैं यहां पहुंचा हूं।

अधिक जानकारी: https://blog.praveen.science/wildcard-rout-is-an-ant-patna/


3
लिंक वर्तमान में मर चुका है। शायद ऐसा ही था: jonathanong.github.io/wildcard-rout-is-an-ant-pattern.html
Ron Burk

@RonBurk आपका url भी मरा हुआ लगता है .. एक नामित पैरामीटर के बाद मेरे पास वैकल्पिक वाइल्डकार्ड कैसे हो सकता है ? "/ कुछ /: आईडी (/ *)?" काम नहीं करता है ..
सोइची हयाशी

शायद अभी भी थोड़ी देर के लिए Google कैश में होगा: webcache.googleusercontent.com/…
Ron Burk

अगर मुझे पता नहीं है कि URL के शुरुआती हिस्से के बाद क्या होता है तो वाइल्डकार्ड रूटिंग का कोई विकल्प है?
माइकल

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.