컨텍스트를 전달하는 동안 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
가 유효하지 않다는 것을 알게되면 추가 컨텍스트를 /
페이지에 전달하고 싶습니다 . 어떻게해야합니까? 리디렉션은 추가 매개 변수를 허용하지 않는 것 같습니다.
여러 경로로 데이터를 전달하는 몇 가지 방법이 있습니다. 물론 정답은 쿼리 문자열입니다. 값이 올바르게 encodeURIComponent 및 decodeURIComponent 인지 확인해야합니다 .
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 });
});
이 '/'
경로를 통해 도달 한 페이지에서이 데이터 개체를 사용할 수 있습니다
'IT story' 카테고리의 다른 글
Git에서 오리진 / 마스터와 오리진 마스터의 차이점은 무엇입니까? (0) | 2020.04.17 |
---|---|
왜 프린트하지 않습니까! (0) | 2020.04.17 |
부울 연산자 && 및 || (0) | 2020.04.17 |
객체 지향 프로젝트를 어떻게 디자인합니까? (0) | 2020.04.17 |
(lambda) 함수 클로저는 무엇을 캡처합니까? (0) | 2020.04.17 |