일부 컨텍스트를 전달하는 동안 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
'programing' 카테고리의 다른 글
파이썬 3에서 stdout에 이진 데이터를 쓰는 방법은 무엇입니까? (0) | 2023.05.15 |
---|---|
POSTgres에서 LIKE와 ~의 차이 (0) | 2023.05.15 |
마지막으로 삽입한 ID에 대한 PostgreSQL 함수 (0) | 2023.05.15 |
작업을 취소하려면 어떻게 해야 합니까?언제 다? (0) | 2023.05.15 |
피클 파일에 여러 개체를 저장하고 로드하시겠습니까? (0) | 2023.05.15 |