[英]trying to understand how html GET and res.redirect works in express
我是nodejs express等人的新手。我試圖了解為什么res.redirect需要GET才能工作。而res.render卻不需要。 這是場景。 到目前為止,我有一個使用護照進行身份驗證的登錄名。 身份驗證后,取決於用戶的類型...。用戶將被發送到特定的html頁面。 如果我只是重新渲染頁面,它就可以正常工作....但是,如果我重新重定向到頁面,則會收到“無法獲取...”錯誤,表明我沒有get('/ page')塊。 這是一個示例代碼:
// get part request page
router.get('/partpage', function(req,res) {
res.render('partpage', {name: user.get("Name"),email:user.get("Email")});
});
// get dealer page
router.get('/dealers', function(req,res) {
res.render('dealers', {name: user.get("Name"),email:user.get("Email")});
});
.
.
.
router.post('/login',
passport.authenticate( 'local',
{sucessRedirect:'/',
failureRedirect:'/users/login',
failureFlash:true}),
function(req,res)
{
.
.
.
// After passport authentication.....
if (user.get("Category")==="dealer")
{
res.redirect('/users/dealers?name='+username+'&email='+useremail);
}
else
{
res.redirect('/users/partpage?name='+username+'&email='+useremail);
}
如果刪除任何一個GET,我都會收到並報錯(“無法獲取...”)。 我不明白為什么會這樣。 更重要的是,我正在將參數傳遞給頁面...哪一個優先? ...顯然這里有問題! 誰能為我解釋一下? 正確的方法是什么?
主頁路由設置如下:
在app.js中
.
.
.
var routes = require('./routes/index');
.
.
.
app.set('views', path.join(__dirname,'views'));
app.set('view options', { layout:'layout.ejs' });
app.set('view engine','ejs');
.
.
.
app.use('/', routes);
res.redirect就像Web服務器接受requrest之后的東西一樣,它在表后面迫使瀏覽器更改url,這意味着302 http代碼。 當res.render是Web服務器時,僅使用jade或ejs來渲染頁面,這意味着200個http代碼。
對於您而言,在用戶訪問/login?Category=dealer
,他/她的瀏覽器將是/users/dealers?name=a&email=b
302。 然后,您的服務器需要路由器router.get('/dealers', fn)
來顯示頁面。 最重要的是,用戶的瀏覽器網址將是/users/dealers?name=a&email=b
。
如果您直接在身份驗證回調中使用res.render
,則用戶的瀏覽器將顯示渲染的頁面,但url仍然是/login?Category=dealer
。
建議在您的情況下使用重定向。 否則,如果用戶按“ F5”刷新頁面,則他/她實際上是刷新URL /login?Category=dealer
,這將不必要地觸發您的身份驗證路由器和邏輯。
更新:
渲染和重定向的區別,(抱歉,我回復晚,由於長城,這些天我無法訪問stackoverflow)
1個
用戶的瀏覽器向您的服務器發出http請求===>
您的服務器獲取請求,並使用res.render輸出響應,這意味着您的服務器在響應標頭中返回“ http status 200”,在響應正文中返回“ html” ==>
用戶的瀏覽器收到“ 200 and html”響應,然后解析“ html”進行查看。
2
用戶的瀏覽器向您的服務器發出http請求===>
您的服務器獲取請求,並使用res.redirect,這意味着您的服務器在響應標頭中返回了“ http狀態302和新url”,但未返回任何響應。==>
用戶的瀏覽器收到“ 302和新的url”響應,然后重新定位到新的url,這意味着用戶的瀏覽器再次使用此新的url ius http請求==>
您的服務器獲取請求,並使用res.render輸出響應,這意味着您的服務器在響應標頭中返回“ http status 200”,在響應正文中返回“ html” ==>
用戶的瀏覽器收到“ 200 and html”響應,然后解析“ html”進行查看。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.