কিছু প্রসঙ্গ পাস করার সময় আমি কীভাবে এক্সপ্রেসগুলিতে পুনর্নির্দেশ করব?


269

আমি নোড.জেএসজে একটি ওয়েব অ্যাপ তৈরি করতে এক্সপ্রেস ব্যবহার করছি। এটি আমার যা আছে তার একটি সরলীকরণ:

var express = require('express');
var jade = require('jade');
var http = require("http");


var app = express();
var server = http.createServer(app);

app.get('/', function(req, res) {
    // Prepare the context
    res.render('home.jade', context);
});

app.post('/category', function(req, res) {
    // Process the data received in req.body
    res.redirect('/');
});

আমার সমস্যা নিম্নলিখিত:

যদি আমি দেখতে পাই যে প্রেরিত ডেটা /categoryবৈধতা দেয় না তবে আমি /পৃষ্ঠায় কিছু অতিরিক্ত প্রসঙ্গ প্রেরণ করতে চাই । আমি এই কিভাবে করতে পারে? পুনর্নির্দেশটি কোনও ধরণের অতিরিক্ত প্যারামিটারের অনুমতি দেয় বলে মনে হয় না।


1
'এক্সপ্রেস পরীক্ষা করে দেখুন flash: stackoverflow.com/questions/12442716/...
tymeJV

পরিভাষা এখানে গুরুত্বপূর্ণ: কোন /পৃষ্ঠা নেই। একটি /রুট রয়েছে, যা এক্সপ্রেস পরিষেবা দিতে পারে, এবং একটি হোমপেজ টেম্পলেট রয়েছে, যা এক্সপ্রেস রেন্ডার করতে পারে। আপনি যদি কোনও পুনর্নির্দেশের পরে হোমপেজ টেমপ্লেট রেন্ডার করার জন্য কিছু ডেটা সংরক্ষণ করতে চান তবে গ্রহণযোগ্য উত্তর সত্ত্বেও সেশনগুলি আপনার বন্ধু। তারা আপনাকে এমন একটি ডেটা স্টোর দেয় যা স্বতন্ত্র ব্রাউজিং ব্যবহারকারীদের জন্য অনুরোধ এবং প্রতিক্রিয়া জুড়ে থাকে যাতে আপনি /categoryপরিচালনা করার সময় ডেটা রাখতে পারেন এবং /হস্তান্তরকালে এটি সেখানে থাকে কিনা তা বাইরে নিয়ে যায় ।
মাইক 'পোম্যাক্স' কামারম্যানস

উত্তর:


366

বিভিন্ন রুটে ডেটা পাস করার কয়েকটি উপায় রয়েছে। সর্বাধিক সঠিক উত্তরটি অবশ্যই কোয়েরি স্ট্রিং। আপনাকে নিশ্চিত করতে হবে যে মানগুলি যথাযথভাবে এনকোডেরিউআরআইকিউম্পোন্ট এবং ডিকোডেরিউআরকিউম্পোন্ট রয়েছে

app.get('/category', function(req, res) {
  var string = encodeURIComponent('something that would break');
  res.redirect('/?valid=' + string);
});

ব্যবহার করে প্যারামিটারগুলি প্রেরণ করে আপনি এটি আপনার অন্যান্য রুটে ছিনিয়ে নিতে পারেন req.query

app.get('/', function(req, res) {
  var passedVariable = req.query.valid;
  // Do something with variable
});

আরও গতিশীল উপায়ে আপনি আপনার urlজন্য ক্যোয়ারী স্ট্রিং তৈরি করতে মূল মডিউলটি ব্যবহার করতে পারেন :

const url = require('url');    
app.get('/category', function(req, res) {
    res.redirect(url.format({
       pathname:"/",
       query: {
          "a": 1,
          "b": 2,
          "valid":"your string here"
        }
     }));
 });

সুতরাং আপনি যদি সব রেক কোয়েরি স্ট্রিং ভেরিয়েবলগুলি পুনর্নির্দেশ করতে চান তবে আপনি কেবল পারেন simply

res.redirect(url.format({
       pathname:"/",
       query:req.query,
     });
 });

এবং আপনি যদি নোড> = 7.x ব্যবহার করেন তবে আপনি querystringমূল মডিউলটিও ব্যবহার করতে পারেন

const querystring = require('querystring');    
app.get('/category', function(req, res) {
      const query = querystring.stringify({
          "a": 1,
          "b": 2,
          "valid":"your string here"
      });
      res.redirect('/?' + query);
 });

এটি করার আরেকটি উপায় হ'ল সেশনে কিছু স্থাপন করা। আপনি কীভাবে এটি এখানে সেট আপ করবেন তা পড়তে পারেন , তবে ভেরিয়েবলগুলি সেট এবং অ্যাক্সেস করা এরকম কিছু:

app.get('/category', function(req, res) {
  req.session.valid = true;
  res.redirect('/');
});

এবং পরে পুনঃনির্দেশের পরে ...

app.get('/', function(req, res) {
  var passedVariable = req.session.valid;
  req.session.valid = null; // resets session variable
  // Do something
});

এক্সপ্রেসের একটি পুরানো বৈশিষ্ট্য ব্যবহার করার বিকল্পও রয়েছে req.flash। এক্সপ্রেসের নতুন সংস্করণে এটি করার জন্য আপনাকে অন্য একটি গ্রন্থাগার ব্যবহার করতে হবে। মূলত এটি আপনাকে ভেরিয়েবল সেট আপ করতে দেয় যা পরের বার আপনি কোনও পৃষ্ঠায় যাওয়ার সময় দেখাবে এবং পুনরায় সেট করবে। এটি ব্যবহারকারীদের ত্রুটি দেখানোর পক্ষে কার্যকর, তবে আবার এটি ডিফল্টরূপে সরানো হয়েছে। সম্পাদনা: একটি লাইব্রেরি পাওয়া গেছে যা এই কার্যকারিতা যুক্ত করে।

আশা করি এটি আপনাকে একটি এক্সপ্রেস অ্যাপ্লিকেশনটিতে কীভাবে তথ্য পাস করবেন সে সম্পর্কে একটি সাধারণ ধারণা দেবে।


6
ক্যোরিগুলি প্রসঙ্গটি পাস করার জন্য সত্যই ঠিক মনে হয় না, কারণ এটি দীর্ঘ অনুচ্ছেদের মতো আরও বড় বা আরও কিছু হতে পারে। সেশন হিসাবে, এটি কাজ করতে পারে। তবে এটি সত্যই সঠিক মনে হচ্ছে না, কারণ এটি সেশনগুলির সঠিক উদ্দেশ্য বলে মনে হচ্ছে না ...
এনরিক মোরেনো তাঁবু

@ ডাবগার ওফস, আপনি প্রশ্নটি জিজ্ঞাসা করেছেন তা বুঝতে পারেন নি। আপনি যদি ক্যোরিস্ট্রিংয়ের মাধ্যমে খুব বেশি তথ্য ব্যবহারকারীকে দেওয়ার বিষয়ে উদ্বিগ্ন হন তবে কোনও ডিবিতে বৈধতা ডেটা সংরক্ষণ করা এবং তারপরে আপনি যখন প্রধান /রুটে আঘাত করবেন তখন কোয়েরি করা ভাল । আরেকটি বিকল্প হ'ল এজেএক্সের মাধ্যমে পোস্টের রুটে কল করা এবং ফলস্বরূপ ডেটা স্থানীয় স্টোরেজে বা অনুরূপ কিছুতে সঞ্চয় করা।
AlbertEngelB

13
উত্তম উত্তর তবে আমি মনে করি সেশনগুলি কোয়েরি স্ট্রিংয়ের চেয়ে ভাল পদ্ধতির - ইউআরএলগুলিতে স্টাফ প্রকাশ করবেন না!
ব্যবহারকারী 2562923

2
@ ব্যবহারকারী 2562923 আমি সম্মত, সেশন বা POST গুলি চারপাশে প্রসঙ্গটি পাস করার জন্য GET এর চেয়ে ভাল। উত্তরটি বেশ অস্পষ্ট ছিল তাই জিজ্ঞাসাবাদক কোন ধরণের তথ্য ঘুরে বেড়াচ্ছেন তা নিশ্চিত ছিলাম না।
AlbertEngelB

নোড
জেএসের

42

next()পুনঃনির্দেশ বা সেশনগুলির সাথে গোলযোগের প্রয়োজন পড়ার জন্য রুটহ্যান্ডারদের মধ্যে ডেটা পাস করার সবচেয়ে সহজ উপায় আমি খুঁজে পেয়েছি । বৈকল্পিকভাবে আপনি শুধু আপনার পেরেছিলাম homeCtrl(req,res)পরিবর্তে next()এবং মাত্র পাস reqএবংres

var express  = require('express');
var jade     = require('jade');
var http     = require("http");


var app    = express();
var server = http.createServer(app);

/////////////
// Routing //
/////////////

// Move route middleware into named
// functions
function homeCtrl(req, res) {

    // Prepare the context
    var context = req.dataProcessed;
    res.render('home.jade', context);
}

function categoryCtrl(req, res, next) {

    // Process the data received in req.body
    // instead of res.redirect('/');
    req.dataProcessed = somethingYouDid;
    return next();
    // optionally - Same effect
    // accept no need to define homeCtrl
    // as the last piece of middleware
    // return homeCtrl(req, res, next);
}

app.get('/', homeCtrl);

app.post('/category', categoryCtrl, homeCtrl);

4
বাডি, আমি এই উত্তরটি ভালবাসি। আমাকে সেখানে একটি গর্ত থেকে বাইরে বেরিয়ে আসতে সাহায্য করেছিল - যদিও আমার পেট আমার কাছে রিক পাস করার জন্য ডাকছিল এবং পরবর্তী () এর পক্ষে যুক্তি হিসাবে রইল বলে আমার আরও পড়ার দরকার আছে।
জনরেড

1
খুব ভাল এবং রক্ষণশীল উত্তর! অন্যান্য উত্তরগুলির তুলনায় অনেক সহজ এবং অনেক বেশি সুরক্ষিত।
ট্রিফোর্সি

2
এই পদ্ধতির বিষয়টি পরিচ্ছন্ন বলে মনে হচ্ছে, তবে আমি নিশ্চিত নই যে এটি অ্যাড্রেস বারটি সর্বশেষ পথে ছেড়ে যাবে বা এটি শেষ হবে কিনা/
ড্যানিয়েলো 515

1
@ ড্যানিয়েলো ৫১৫ এটি দুর্ভাগ্যক্রমে / বিভাগগুলিতে সমাপ্ত হবে, সুতরাং এটি সরাসরি / বিভাগগুলিতে সরাসরি দর্শন দেওয়ার মতোই ...
ম্যানুয়েল গ্রাফ

2
আমি একমত নই যে আপনি কেবল ভিন্ন ভিন্ন দৃষ্টিভঙ্গি সরবরাহের জন্য একটি রাউটারকে পরিষেবা হিসাবে ব্যবহার করছেন যা ইউআরএলটিকে যেমন ছেড়ে দেবে, আপনার কোডটি সেভাবে গঠন করা খারাপ ধারণা, পরবর্তী উদ্দেশ্যটি পরবর্তী মিডলওয়্যারের দিকে চলে যাচ্ছে এবং আমরা সাধারণত রাউটারের যুক্তি থেকে আমাদের ব্যবসায়িক যুক্তি আলাদা করুন
ফরিদ অ্যালামনোউটি

9

আমাকে আরও একটি সমাধান খুঁজে পেতে হয়েছিল কারণ প্রদত্ত সমাধানগুলির কোনওটিই আমার প্রয়োজনীয়তাগুলি পূরণ করে না, নিম্নলিখিত কারণে:

  • অনুসন্ধানের স্ট্রিং : আপনি কোয়েরি স্ট্রিংগুলি ব্যবহার করতে নাও পারেন কারণ URL টি আপনার ব্যবহারকারীদের দ্বারা ভাগ করা যেতে পারে এবং কখনও কখনও কোয়েরি প্যারামিটারগুলি অন্য কোনও ব্যবহারকারীর পক্ষে বোঝায় না। উদাহরণস্বরূপ, কোনও ত্রুটি যেমন ?error=sessionExpiredদুর্ঘটনাক্রমে অন্য ব্যবহারকারীর কাছে প্রদর্শিত হবে না।

  • পুনঃনির্ধারণ : আপনি এটি ব্যবহার করতে পারবেন না req.sessionকারণ আপনার এটির জন্য এক্সপ্রেস-সেশন নির্ভরতা প্রয়োজন , যার মধ্যে একটি সেশন স্টোর স্থাপন করা (যেমন মোংগোডিবি) দরকার যা আপনার প্রয়োজন হয় না, বা সম্ভবত আপনি ইতিমধ্যে একটি কাস্টম ব্যবহার করছেন সেশন স্টোর সমাধান।

  • পরের () : আপনি ব্যবহার করতে না চাইতে পারেন next()বা next("router")কারণ এটি মূলত আপনার মূল পৃষ্ঠাটি মূল URL এর অধীনে রেন্ডার করে, এটি সত্যিই নতুন URL- এ পুনর্নির্দেশ নয়, আরও ফরোয়ার্ড / পুনর্লিখনের মতো, যা গ্রহণযোগ্য নাও হতে পারে।

সুতরাং এটি আমার চতুর্থ সমাধান যা পূর্ববর্তী কোনও সমস্যায় ভুগছে না। মূলত এটিতে অস্থায়ী কুকি ব্যবহার করা জড়িত, যার জন্য আপনাকে প্রথমে কুকি-পার্সার ইনস্টল করতে হবে । স্পষ্টতই এর অর্থ এটি কেবলমাত্র কুকি সক্ষম হওয়া এবং সীমিত পরিমাণে ডেটা সহ কাজ করবে।

বাস্তবায়ন উদাহরণ:

var cookieParser = require("cookie-parser");

app.use(cookieParser());

app.get("/", function(req, res) {
    var context = req.cookies["context"];
    res.clearCookie("context", { httpOnly: true });
    res.render("home.jade", context); // Here context is just a string, you will have to provide a valid context for your template engine
});

app.post("/category", function(req, res) {
    res.cookie("context", "myContext", { httpOnly: true });
    res.redirect("/");
}

কোনও সেশন স্টোরের প্রয়োজন নেই express-session। একটি ডাটাবেস সেশন সার্ভার পুনরায় আরম্ভ জুড়ে সেশন স্থির করে তোলে।
মাইক 'পোম্যাক্স' কামারম্যানস

6

app.set এবং app.get ব্যবহার করুন

ডেটা সেট করা হচ্ছে

router.get(
  "/facebook/callback",
  passport.authenticate("facebook"),
  (req, res) => {
    req.app.set('user', res.req.user)
    return res.redirect("/sign");
  }
);

তথ্য প্রাপ্তি

router.get("/sign", (req, res) => {
  console.log('sign', req.app.get('user'))
});

2
এটি কার্যকর করার জন্য খারাপ ধারণা এটি সমস্ত ব্যবহারকারীর উপর প্রভাব ফেলতে পারে সমস্ত req.app সমস্ত ব্যবহারকারীর জন্য একই। আমরা এর পরিবর্তে এক্সপ্রেস-সেশন ব্যবহার করতে পারি ।
উজ্জল দাস

5

আমি অন্য কোনও নির্ভরতা ব্যবহার না করে যা পরামর্শ দিই তা কেবলমাত্র নোড এবং এক্সপ্রেস, অ্যাপ.লোকলস ব্যবহার করুন, এখানে একটি উদাহরণ দেওয়া হয়েছে:

    app.get("/", function(req, res) {
        var context = req.app.locals.specialContext;
        req.app.locals.specialContext = null;
        res.render("home.jade", context); 
        // or if you are using ejs
        res.render("home", {context: context}); 
    });

    function middleware(req, res, next) {
        req.app.locals.specialContext = * your context goes here *
        res.redirect("/");
    }

2
আমি এটি একটি খারাপ ধারণা বলে মনে করি কারণ রেকর্ড.অ্যাপ.লোকালগুলি অনুরোধটি করেছে এমন একটিকেই নয়, সমস্ত ব্যবহারকারীকে প্রভাবিত করছে। অবশ্যই এটি ব্যবহারকারীর কাছে পৌঁছে দেওয়ার সাথে সাথে আপনি ডেটা সাফ করবেন, তবে আমি কল্পনা করতে পারি যে এটি এখনও আপনার সাথে সাংঘর্ষিক এবং সময়ে সময়ে ভুল তথ্য প্রদর্শন করবে। এবং যদি আপনাকে যাইহোক এটি পরিষ্কার করতে হয় তবে আপনি কেবল এটির পরিবর্তে সেশনে এটি সঞ্চয় করতে পারেন।
স্ট্যাকাররা

1
প্রকৃতপক্ষে এটি কেবল "অনন্য" ব্যবহারকারীদের দ্বারা প্রেরিত অনুরোধকে প্রভাবিত করবে, এমনকি যদি 2 বা ততোধিক ব্যবহারকারী "একই সময়ে" অনুরোধগুলি প্রেরণ করে তবে প্রতিটি ব্যবহারকারীর নিজস্ব অনুরোধের বিষয়টি এবং তার স্থানীয় লোকেরা আপত্তি জানায়, সেভাবে এটি সম্পূর্ণ নিরাপদ ব্যবহার
হুসেন ডিমেসি

req একটি অনন্য ব্যবহারকারীর জন্য, কিন্তু req.app সমস্ত ব্যবহারকারীর জন্য।
জিরোচো

বার্তাটি প্রেরণে এক্সপ্রেস-সেশনটি ব্যবহার করুন
ujjal das

3

আপনি ক্যোরি স্ট্রিংয়ের মাধ্যমে কী / মান জোড়ার ডেটার ছোট্ট বিটগুলি পাস করতে পারেন:

res.redirect('/?error=denied');

এবং হোম পৃষ্ঠায় জাভাস্ক্রিপ্ট এটিকে অ্যাক্সেস করতে এবং সেই অনুসারে তার আচরণটি সামঞ্জস্য করতে পারে।

মনে রাখবেন যে /categoryব্রাউজারের অ্যাড্রেস বারে ইউআরএল হিসাবে থাকতে আপনার যদি আপত্তি না থাকে তবে আপনি পুনর্নির্দেশের পরিবর্তে সরাসরি রেন্ডার করতে পারেন। আইএমএইচএইচও বহুবার লোক পুনঃনির্দেশগুলি ব্যবহার করে কারণ পুরানো ওয়েব ফ্রেমওয়ার্কগুলি সরাসরি প্রতিক্রিয়া জানানো কঠিন করে তোলে, তবে এটি প্রকাশে সহজ:

app.post('/category', function(req, res) {

  // Process the data received in req.body

  res.render('home.jade', {error: 'denied'});
});

@ Dropped.on.Caprica যেমন মন্তব্য করেছে, AJAX ব্যবহার করা ইউআরএল পরিবর্তনের উদ্বেগ দূর করে।


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

@ ডাব্গার সম্ভবত একটি এজেএক্স পোস্ট ব্যবহার করবেন?
AlbertEngelB

1

আমরা এক্সপ্রেস-সেশন ব্যবহার করতে পারিপ্রয়োজনীয় ডেটা প্রেরণের জন্য

আপনি অ্যাপ্লিকেশন শুরু যখন

const express = require('express');
const app = express();
const session = require('express-session');
app.use(session({secret: 'mySecret', resave: false, saveUninitialized: false}));

সুতরাং পুনঃনির্দেশের আগে সেশনের প্রসঙ্গটি সংরক্ষণ করুন

app.post('/category', function(req, res) {
    // add your context here 
req.session.context ='your context here' ;
    res.redirect('/');
});

এখন আপনি সেশনের জন্য যে কোনও জায়গায় প্রসঙ্গটি পেতে পারেন। এটি কেবল req.session.context দ্বারা পেতে পারে

app.get('/', function(req, res) {

    // So prepare the context
var context=req.session.context;
    res.render('home.jade', context);
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.