2016-08-24 64 views
0

我正在從PHP轉移到NodeJS,我試圖理解中間件重定向失控的原因。NodeJS重複重定向

// Check to see if the request includes a session Username 
app.use(function (req, res, next) { 
    sessionmanager = req.session; 
    if(sessionmanager.Username) { 
    console.log('Session Details detected'); 
    next(); 
    } else { 
    console.log('No session details detected, pushing user to login page'); 
    res.redirect('/login'); 
    } 
}); 

// User Landing Page 
app.get('/', function (req, res) { 
    console.log('Request for landing page'); 
    res.send('Welcome Page!'); 
}); 


// User Login Page 
app.get('/login', function (req, res) { 
    console.log('Request for User login page'); 
    res.sendFile(path.join(__dirname, './public', 'login.html')); 
}); 

當我訪問本地主機:3000重定向我到localhost:3000 /登錄,但頁面加載失敗,因爲它看起來像它被重定向的次數太多。 當我查看控制檯日誌時,我可以計數;超過20行的消息'沒有檢測到會話細節,推送用戶登錄頁面'。

從我可以猜到,重定向循環回到app.use函數,未能通過會話manager.Username語句,並陷入循環。 將流量重定向到/ login頁面的最佳方式是什麼?我可以在app.use中放置一個排除子句嗎?

回答

1

從閱讀文檔:https://expressjs.com/en/guide/using-middleware.html 您可以設置請求,以便/ login在app.use之前出現,因此它不是重定向循環的一部分。 例子:

// User Login Page 
app.get('/login', function (req, res) { 
    console.log('Request for User login page'); 
    res.sendFile(path.join(__dirname, './public', 'login.html')); 
}); 

// Check to see if the request includes a session Username 
app.use(function (req, res, next) { 
    sessionmanager = req.session; 
    if(sessionmanager.Username) { 
    console.log('Session Details detected'); 
    next(); 
    } else { 
    console.log('No session details detected, pushing user to login page'); 
    res.redirect('/login'); 
    //res.sendFile(path.join(__dirname, './public', 'login.html')); 
    } 
}); 

// User Landing Page 
app.get('/', function (req, res) { 
    console.log('Request for landing page'); 
    res.send('Welcome Page!'); 
}); 

現在,您可以發出請求/登錄URL和任何網頁過去app.use會推動你回到登錄頁面,如果你沒有登錄會話

0

你。在中間件下面有您的登錄路線。它應該是你的路由列表頂部的東西像這樣

// User Login Page 
app.get('/login', function (req, res) { 
    console.log('Request for User login page'); 
    res.sendFile(path.join(__dirname, './public', 'login.html')); 
}); 

// Check to see if the request includes a session Username 
app.use(function (req, res, next) { 
    sessionmanager = req.session; 
    if(sessionmanager.Username) { 
    console.log('Session Details detected'); 
    next(); 
    } else { 
    console.log('No session details detected, pushing user to login page'); 
    res.redirect('/login'); 
    } 
}); 

// User Landing Page 
app.get('/', function (req, res) { 
    console.log('Request for landing page'); 
    res.send('Welcome Page!'); 
}); 
  • 中間件下面你提到將執行所有的路由。
  • 在你的代碼被重定向到/登錄,如果會議沒有設定
  • 將前/登錄導致重定向循環

希望你能理解

再次檢查中間件