programing

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

telecom 2023. 5. 15. 21:16
반응형

일부 컨텍스트를 전달하는 동안 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. 추가 를 검지않다니에 . 추가 컨텍스트를 전달하고 싶습니다./페이지. 어떻게 이럴 수 있죠?리디렉션에서 추가 매개 변수를 허용하지 않는 것 같습니다.

데이터를 다른 경로로 전달하는 몇 가지 방법이 있습니다.물론 가장 정확한 대답은 쿼리 문자열입니다.값이 올바르게 인코딩되었는지 확인해야 합니다.URI 구성 요소 및 디코딩URI 구성 요소.

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

보다 동적인 방법으로 코어 모듈을 사용하여 쿼리 문자열을 생성할 수 있습니다.

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를 사용하는 경우 코어 모듈도 사용할 수 있습니다.

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최신 버전의 Express에서는 다른 라이브러리를 사용해야 합니다.기본적으로 다음에 페이지로 이동할 때 표시 및 재설정할 변수를 설정할 수 있습니다.사용자에게 오류를 표시하는 데 유용하지만 기본적으로 제거되었습니다.편집: 이 기능을 추가하는 라이브러리를 찾았습니다.

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

하는 가장 은 routeHandlers를 사용하는 입니다.next()리디렉션 또는 세션을 방해할 필요가 없습니다.의 선적으전걸화수다있니습를로택▁your▁call다니▁option▁just있습▁could▁youally수선걸라고 부를 수도 있습니다.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)를 설정하는 것을 포함하는 Express-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("/");
}

앱을 사용합니다.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'))
});

우리는 필요한 데이터를 보내기 위해 express-packets를 사용할 수 있습니다.

앱을 초기화할 때

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

이제 세션에 대한 컨텍스트를 어디서든 얻을 수 있습니다.그것은 단지 요청에 의해서 얻을 수 있습니다.

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

    // So prepare the context
var context=req.session.context;
    res.render('home.jade', context);
});

노드와 express, app.local만 사용하여 다른 종속성을 사용하지 않고 제안하는 내용은 다음과 같습니다.

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

그리고 홈페이지에 있는 자바스크립트는 그것에 접속하여 그에 따라 행동을 조정할 수 있습니다.

당신이 괜찮다면 참고하세요./category브라우저 주소 표시줄의 URL로 유지되므로 리디렉션 대신 직접 렌더링할 수 있습니다.IMHO는 오래된 웹 프레임워크가 직접 응답을 어렵게 만들었기 때문에 사람들이 리디렉션을 사용하는 경우가 많지만, 다음과 같이 표현하기는 쉽습니다.

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

  // Process the data received in req.body

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

@Drop.on처럼.Caprica는 AJAX를 사용하면 URL 변경 우려가 해소된다고 언급했습니다.

2021년 업데이트: 시도했습니다.url.format그리고.querystring둘 다 더 이상 사용되지 않습니다. 대신에 우리는 사용할 수 있습니다.URLSearchParams

const {URLSearchParams} = require('url')
               
app.get('/category', (req, res) =>{
    const pathname = '/?'
    const components ={
     a:"a",
     b:"b"
    }

    const urlParameters = new URLSearchParams(components)
    res.redirect(pathname + urlParameters)
})

저는 제에서 매우 간단하지만 효율적인 기술을 사용합니다.js ( 진입점) 저는 다음과 같은 변수를 정의합니다.

let authUser = {};

그런 다음 경로 페이지에서 할당합니다(로그인 성공 후 등).

authUser = matchedUser

최선의 방법은 아닐 수도 있지만 제 요구에 맞는 방법입니다.

 app.get('/category', function(req, res) {
  var string = query
  res.redirect('/?valid=' + string);
});

ejs에서 유효한 것을 직접 사용할 수 있습니다.

<% var k = valid %>

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

반응형