এক্সপ্রেস রেকর্ড অবজেক্টের সাথে কীভাবে অনুরোধের পাথ পাবেন


158

আমি এক্সপ্রেস + নোড.জেএস ব্যবহার করছি এবং আমার কাছে একটি রেকর্ড অবজেক্ট রয়েছে, ব্রাউজারে অনুরোধটি হ'ল অ্যাকাউন্ট / কিন্তু আমি যখন লগ ইন করি তখনই আমি '/' --- না '/ অ্যাকাউন্ট' পাই।

  //auth required or redirect
  app.use('/account', function(req, res, next) {
    console.log(req.path);
    if ( !req.session.user ) {
      res.redirect('/login?ref='+req.path);
    } else {
      next();
    }
  });

রেক.পথটি কখন / অ্যাকাউন্টে হওয়া উচিত ??


2
TypeError: Cannot read property 'path' of undefined
chovy

req.route.path সঠিক ও নথিভুক্ত করা এখানে । আপনি এক্সপ্রেসের কোন সংস্করণ ব্যবহার করছেন?
zemirco

আমি একই সমস্যা হচ্ছে। req.routeঅনির্ধারিত. আমি এক্সপ্রেস ব্যবহার করছি 3.4.4। কী কারণে রুটটি অপরিশোধিত হতে পারে?
ডেভিডপাহলারের

@ভিনায়ার রেউক.আরউটি.পথটি এখনও আমাকে / ক্যুইজের পরিবর্তে তৈরি / তৈরি করে দেয় যা পুরো ইউআরএল
সন্দীপ সুবেদী

এটি উদ্দেশ্যমূলক আচরণ। এবং আপনি এটি আলিঙ্গন করা উচিত। আপনার হ্যান্ডলারের পুরো পথটির দিকে নজর দেওয়া উচিত নয়, তবে কেবল সেই পথের 'স্থানীয়' অংশ সম্পর্কে। এটি যে পথটি চালিত হয়েছিল তার পরে অংশ। এটি হ্যান্ডলারের ফাংশনটিকে অন্য প্রসঙ্গে পুনরায় ব্যবহার করতে আরও সহজ করে তোলে।
স্টিজন ডি উইট

উত্তর:


234

নিজে কিছুটা নাটক খেলে আপনার ব্যবহার করা উচিত:

console.log(req.originalUrl)


3
আমি মনে করি মিডলওয়্যারের অবস্থানের সাথে এটির কিছু করার ছিল, তবে আপনি সঠিক, এটি কোনও অর্থবোধ করে না।
Menztrual

1
এটি অবশ্যই মিডওয়্যার। এক্সপ্রেস 4-তে অতিরিক্ত রাউটারগুলির সাথেও এটি ঘটে। হয় যখন কোনও প্রদত্ত পাথের উপর দিয়ে মাউন্ট করা হয়, তখন নিজের ভিতরেই এটি শিকড় বন্ধ হয়ে থাকে তা ভেবে দেখা যায়। এটি বিচ্ছিন্নতার জন্য দুর্দান্ত, তবে মুশকিল যখন আপনি জানেন না যে কীভাবে আসল পূর্ণ মানটি কী তা পাওয়া যায়। এই পোস্ট করার জন্য ধন্যবাদ!
juanpaco

3
যে কেউ এখানে getting.০-এ পৌঁছেছে, পুনঃ-রাউটিং উদ্দেশ্যে মিডকওয়্যার দ্বারা পরিবর্তনযোগ্য হিসাবে ডিজাইন.আরল ডিজাইন করা হয়েছে এবং যেখানে ডাকা হয়েছে তার উপর নির্ভর করে রেইক.পাথটি মাউন্ট পয়েন্টগুলি হারিয়ে যেতে পারে। expressjs.com/en/api.html#req.originalUrl
খ্রিস্টান ডেভিস

3
আপনি যদি কোয়েরি স্ট্রিংটি অন্তর্ভুক্ত না করতে চান:const path = req.originalUrl.replace(/\?.*$/, '');
অ্যাডাম রেইস

1
সতর্কতা: ওপি প্রশ্নের ভিত্তিতে এটি একটি বিভ্রান্তিমূলক উত্তর। এটি উপস্থিত থাকলে ক্যোয়ারী স্ট্রিংও (যেমন? A = b & c = 5) ফিরিয়ে দেবে। দেখুন expressjs.com/en/api.html#req.originalUrl
Ciabaros

60

কিছু ক্ষেত্রে আপনার ব্যবহার করা উচিত:

req.path

সম্পূর্ণ অনুরোধ করা URL এর পরিবর্তে এটি আপনাকে পথ দেয়। উদাহরণস্বরূপ, যদি আপনি কেবল ব্যবহারকারী কোন পৃষ্ঠায় অনুরোধ করেছেন এবং সমস্ত প্রকারের প্যারামিটারগুলি ইউআরএল নয়:

/myurl.htm?allkinds&ofparameters=true

রেক.পথ আপনাকে দেবে:

/myurl.html

1
সতর্কতা অবলম্বন করুন যে আপনি যদি এই ইউআরএলটির বিরুদ্ধে চেক করছেন তবে এটি যদি আপনার অ্যাপ্লিকেশনে বৈধ হয় তবে এটি পিছনে থাকা স্ল্যাশের জন্য একটি চেক অন্তর্ভুক্ত করে। (অর্থাত্ চেক /demoকরাও সম্ভাব্যভাবে পরীক্ষা করা উচিত /demo/)।
বিনয়

আপনি যদি ক্যোয়ারী স্ট্রিংটি অন্তর্ভুক্ত না করতে চান: কনস্ট পাথ = req.originalUrl.replace (/\?.*$/, '');
অ্যাডাম রেইস

req.pathএর সংক্ষিপ্ত বিবরণ url.parse(req.url).pathnameএবং এটি গ্রহণযোগ্য উত্তর হওয়া উচিত
সারটেসেট

1
@sertsedat ভুল। req.pathআপনার অ্যাপ্লিকেশনটি যেখানে মাউন্ট করা হয়েছে সেখানে আপনাকে আপেক্ষিক পথ দেয়। এটা root- এ মাউন্ট করা হয়েছে যদি চেয়ে সঠিক, কিন্তু একটি পাথ জন্য /my/path, মধ্যে একটি অ্যাপ্লিকেশন এ মাউন্ট /my, req.urlদেব /path
স্টিজন ডি উইট

21

পরিপূরক হিসাবে, এখানে ডকুমেন্টেশন থেকে প্রসারিত একটি উদাহরণ দেওয়া হয়েছে, যা এক্সপ্রেসের সাথে সমস্ত ক্ষেত্রে পাথ / ইউআরএল অ্যাক্সেস সম্পর্কে আপনার যা জানতে হবে তা খুব সুন্দরভাবে আবৃত করে:

app.use('/admin', function (req, res, next) { // GET 'http://www.example.com/admin/new?a=b'
  console.dir(req.originalUrl) // '/admin/new?a=b' (WARNING: beware query string)
  console.dir(req.baseUrl) // '/admin'
  console.dir(req.path) // '/new'
  console.dir(req.baseUrl + req.path) // '/admin/new' (full path without query string)
  next()
})

এর উপর ভিত্তি করে: https://expressjs.com/en/api.html#req.originalUrl

উপসংহার: সি 1 মুরের উত্তর উপরে যেমন উল্লেখ করেছে , ব্যবহার করুন:

var fullPath = req.baseUrl + req.path;


9
//auth required or redirect
app.use('/account', function(req, res, next) {
  console.log(req.path);
  if ( !req.session.user ) {
    res.redirect('/login?ref='+req.path);
  } else {
    next();
  }
});

রেক.পথটি কখন / অ্যাকাউন্টে হওয়া উচিত ??

এর কারণ হ'ল এক্সপ্রেস আপনার হ্যান্ডলারের ক্রিয়াকলাপটি যেভাবে মাউন্ট করা হয়েছে সে পথে বিয়োগ করে '/account'

কেন তারা এই কাজ করে?

কারণ এটি হ্যান্ডলার ফাংশনটিকে পুনরায় ব্যবহার করা সহজ করে। আপনি এমন একটি হ্যান্ডলার ফাংশন তৈরি করতে পারেন যা বিভিন্ন কাজ করে req.path === '/'এবং req.path === '/goodbye'উদাহরণস্বরূপ:

function sendGreeting(req, res, next) {
  res.send(req.path == '/goodbye' ? 'Farewell!' : 'Hello there!')
}

তারপরে আপনি এটিকে একাধিক প্রান্তে স্থাপন করতে পারেন:

app.use('/world', sendGreeting)
app.use('/aliens', sendGreeting)

প্রদান:

/world           ==>  Hello there!
/world/goodbye   ==>  Farewell!
/aliens          ==>  Hello there!
/aliens/goodbye  ==>  Farewell!

9

আপনি যদি কোয়েস্ট্রিং ছাড়াই সত্যিই কেবল "পথ" পেতে চান, আপনি urlপার্স করতে লাইব্রেরিটি ব্যবহার করতে পারেন এবং কেবলমাত্র url এর পাথ অংশ পেতে পারেন।

var url = require('url');

//auth required or redirect
app.use('/account', function(req, res, next) {
    var path = url.parse(req.url).pathname;
    if ( !req.session.user ) {
      res.redirect('/login?ref='+path);
    } else {
      next();
    }
});

এটাই আমি চাই req.query.refলগইন সফল হলে এটি ব্যবহার করুন
রায়ান উউ

এটি সর্বজনীন কোডের সাথে দুর্দান্তভাবে কাজ করে যেহেতু এটি অবস্থানের অনুমানের সাথে খাপ খায়। ক্লায়েন্ট এবং সার্ভার জুড়ে মনে রাখার মতো কম জিনিস এবং ইউনিট পরীক্ষার পক্ষে সহজ।
চেম্বারলাইন

req.pathurl.parse(req.url).pathname
22

8

সংস্করণ ৪.x এর জন্য আপনি এখন পুরো পথটি পেতে req.baseUrlঅতিরিক্ত ব্যবহার করতে পারেন req.path। উদাহরণস্বরূপ, ওপি এখন এর মতো কিছু করবে:

//auth required or redirect
app.use('/account', function(req, res, next) {
  console.log(req.baseUrl + req.path);  // => /account

  if(!req.session.user) {
    res.redirect('/login?ref=' + encodeURIComponent(req.baseUrl + req.path));  // => /login?ref=%2Faccount
  } else {
    next();
  }
});

5

req.route.path আমার পক্ষে কাজ করছে

var pool = require('../db');

module.exports.get_plants = function(req, res) {
    // to run a query we can acquire a client from the pool,
    // run a query on the client, and then return the client to the pool
    pool.connect(function(err, client, done) {
        if (err) {
            return console.error('error fetching client from pool', err);
        }
        client.query('SELECT * FROM plants', function(err, result) {
            //call `done()` to release the client back to the pool
            done();
            if (err) {
                return console.error('error running query', err);
            }
            console.log('A call to route: %s', req.route.path + '\nRequest type: ' + req.method.toLowerCase());
            res.json(result);
        });
    });
};

মৃত্যুদন্ড কার্যকর করার পরে আমি নিম্নলিখিতটি কনসোলে দেখতে পাচ্ছি এবং আমি আমার ব্রাউজারে নিখুঁত ফলাফল পাই।

Express server listening on port 3000 in development mode
A call to route: /plants
Request type: get
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.