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


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.