এক্সপ্রেস-জেএস ওয়াইল্ডকার্ড পথের নীচে এবং সমস্ত কিছুর জন্য কভার করার জন্য রাউটিং


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*মতো সমস্ত রুটকে বাধা দেয় তবে আপনি কি এর পরিবর্তে মিডলওয়্যার তৈরি করতে চান না?
রায়নস

4
আপনি যা চেয়েছেন সে বিষয়ে সাবধানতা অবলম্বন করুন: /foo*ম্যাচগুলি /foo/barকিন্তু মিলগুলিও /foolishযা সম্ভবত আপনি চান না।
উইক

উত্তর:


112

আমার মনে হয় আপনার 2 টি রুট থাকতে হবে। আপনি যদি সংযুক্ত রাউটারের 331 লাইনের দিকে লক্ষ্য করেন তবে একটি পাথের * একটি পথ দিয়ে প্রতিস্থাপিত হয় + তাই 1 বা ততোধিক অক্ষরের সাথে মিলবে।

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

আপনার যদি 2 টি রুট থাকে যা একই ক্রিয়া করে তবে আপনি এটি শুকনো রাখতে নিম্নলিখিতগুলি করতে পারেন ।

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);

104
app.get(["/foo", "/foo*"], /* function */);পাশাপাশি পছন্দসই হতে পারে!
ক্রিস ফস্টার

9
স্ট্রিংগুলির একটি অ্যারেতে প্রবেশ করা আমার পক্ষেও পছন্দনীয়। দুর্ভাগ্যক্রমে: অ্যাপ্লিকেশনটিতে একটি অ্যারে পাস করা V VERB () অবচয় করা হয়েছে এবং ৪.০ এ সরানো হবে
কোডওয়ারিওর

10
স্ট্রিংগুলির একটি অ্যারেতে প্রবেশ করা এক্সপ্রেস ৪.৯.১ এ পুনরুদ্ধার করা হয়েছে।
পিট টিএনটি

30

সংযোগ রাউটারটি এখন সরানো হয়েছে ( https://github.com/senchalabs/connect/issues/262 ), লেখক বলেছেন যে রাউটিংয়ের জন্য আপনার সংযোগের শীর্ষে একটি কাঠামো ব্যবহার করা উচিত।

এক্সপ্রেস বর্তমানে দু'টি পৃথক রুটের প্রয়োজনীয়তা অপসারণ করে app.get("/foo*")as app.get(/\/foo(.*)/)এটি পূর্ববর্তী উত্তরের বিপরীতে (বর্তমানে সরিয়ে নেওয়া সংযোগ রাউটারকে উল্লেখ করে) বলেছিল যে " *কোনও পথে বদলে গেছে .+"।

আপডেট: এক্সপ্রেস এখন "পাথ-টু-রিজেক্সপ" মডিউলটি ব্যবহার করে (এক্সপ্রেস ৪.০.০ থেকে) যা বর্তমানে বর্ণিত সংস্করণে একই আচরণ বজায় রাখে । এই মডিউলটির সর্বশেষতম সংস্করণটি আচরণটি রাখে কিনা তা আমার কাছে অস্পষ্ট but


সুতরাং আমাদের ব্যবহার করা উচিত। + বা *?
টাইলার ল্যাঙ্গান

4
ব্যবহার করুন /\/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

অ্যারেতে আপনি রেক.প্যারামগুলিতে পাসিং ভেরিয়েবলগুলিও ব্যবহার করতে পারেন:

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

4

যারা নোড / এক্সপ্রেস শিখছেন (কেবল আমার মতো): সম্ভব হলে ওয়াইল্ডকার্ড রাউটিং ব্যবহার করবেন না!

আমি জিইটি / ব্যবহারকারী / / আইডি / যাই হোক না কেন ওয়াইল্ডকার্ড রাউটিং ব্যবহার করে রাউটিংটি বাস্তবায়ন করতে চেয়েছিলাম। আমি এখানে এসেছি

আরও তথ্য: https : //blog.praveen.s ज्ञान/ wildcard-routing-is-an-anti-pattern/


4
লিঙ্কটি বর্তমানে মারা গেছে। সম্ভবত এটি এর মতোই ছিল: jonathanong.github.io/wildcard-routing-is-an-anti-pattern.html
রন বার্ক

@ রনবার্ক আপনার ইউআরএলটিও মারা গেছে বলে মনে হচ্ছে .. নামকরণের প্যারামিটারের পরে আমি কীভাবে wildচ্ছিক ওয়াইল্ডকার্ড রাখতে পারি ? "/ কিছু /: আইডি (/ *)?" কাজ করে না ..
সোচি হায়াশি

সম্ভবত এখনও কিছু সময়ের জন্য গুগল ক্যাশে থাকবে: webcache.googleusercontent.com/…
রন বার্ক

ইউআরএলটির প্রাথমিক অংশের পরে কী আসে তা যদি আমার কোনও ধারণা না থাকে তবে কি ওয়াইল্ডকার্ড রাউটিংয়ের বিকল্প আছে?
মাইকেল

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.