IT story

컨텍스트를 전달하는 동안 expressjs로 리디렉션하려면 어떻게해야합니까?

hot-time 2020. 4. 17. 08:27
반응형

컨텍스트를 전달하는 동안 expressjs로 리디렉션하려면 어떻게해야합니까?


node.js에서 웹 앱을 만들기 위해 express를 사용하고 있습니다. 이것은 내가 가진 것의 단순화입니다.

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가 유효하지 않다는 것을 알게되면 추가 컨텍스트를 /페이지에 전달하고 싶습니다 . 어떻게해야합니까? 리디렉션은 추가 매개 변수를 허용하지 않는 것 같습니다.


여러 경로로 데이터를 전달하는 몇 가지 방법이 있습니다. 물론 정답은 쿼리 문자열입니다. 값이 올바르게 encodeURIComponentdecodeURIComponent 인지 확인해야합니다 .

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

따라서 모든 요청 쿼리 문자열 변수를 리디렉션하려면 간단하게 수행 할 수 있습니다

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

그리고 Node> = 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
});

Express의 이전 기능을 사용하는 옵션도 있습니다 req.flash. 최신 버전의 Express에서 그렇게하려면 다른 라이브러리를 사용해야합니다. 기본적으로 다음에 페이지로 이동할 때 표시되고 재설정되는 변수를 설정할 수 있습니다. 사용자에게 오류를 표시하는 데 편리하지만 기본적으로 제거되었습니다. 편집 : 이 기능을 추가하는 라이브러리를 찾았습니다.

잘하면 Express 응용 프로그램에서 정보를 전달하는 방법에 대한 일반적인 아이디어를 얻을 수 있기를 바랍니다.


경로 처리기 사이에 데이터를 전달 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);

제공된 솔루션 중 어느 것도 실제로 내 요구 사항을 충족하지 못했기 때문에 다른 솔루션을 찾아야했습니다.

  • 쿼리 문자열 : 사용자가 URL을 공유 할 수 있고 때로는 쿼리 매개 변수가 다른 사용자에게 적합하지 않기 때문에 쿼리 문자열을 사용하지 않을 수 있습니다. 예를 들어 ?error=sessionExpired실수로 다른 사용자 에게 오류 가 표시되어서는 안됩니다.

  • req.session : 세션 저장소 (예 : MongoDB) 설정이 포함되어 있거나 세션이 필요하지 않거나 이미 사용자 정의를 사용중인 req.session경우 명시적인 세션 종속성이 필요하므로 사용하지 않을 수 있습니다. 세션 저장소 솔루션.

  • next () : 사용하고 싶지 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("/");
}

다음은 다른 종속성을 사용하지 않고 제안하는 것입니다. 노드와 표현 만 사용하고 app.locals를 사용하십시오. 예를 들어 보겠습니다.

    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("/");
    }

쿼리 문자열을 통해 작은 비트의 키 / 값 쌍 데이터를 전달할 수 있습니다.

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

그리고 홈 페이지의 javascript는 그에 액세스하고 그에 따라 동작을 조정할 수 있습니다.

/category브라우저 주소 표시 줄에서 URL로 유지 하는 것이 마음 들지 않으면 리디렉션하는 대신 직접 렌더링 할 수 있습니다. IMHO는 오래된 웹 프레임 워크가 직접 응답하기 어렵 기 때문에 사람들이 리디렉션을 사용하는 경우가 많지만 표현하기 쉽습니다.

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

  // Process the data received in req.body

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

@ Dropped.on.Caprica가 언급했듯이 AJAX를 사용하면 URL 변경 문제가 제거됩니다.


솔루션 중 하나는 본문 파서 미들웨어이며 데이터를 JSON 객체로 전달합니다.

var express = require('express');
var jade = require('jade');
var http = require("http");
const bodyParser = require('body-parser') //requiring body parser 


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
  //pass the data as an json object 
  res.redirect('/', { data: data });
});

'/'경로를 통해 도달 한 페이지에서이 데이터 개체를 사용할 수 있습니다

참고 URL : https://stackoverflow.com/questions/19035373/how-do-i-redirect-in-expressjs-while-passing-some-context

반응형