2012-01-12 112 views
1

這是我第一次使用Express'app.all()。當用戶通過外部oAuth提供商註冊時,我仍然需要他們在返回網站後提供電子郵件。我基本上將它們設置爲在數據庫中處於非活動狀態並檢查req.session.active在ExpressJS中處理重定向,同時避免重定向循環

我在做什麼是

app.all('*', function(req, res, next) { 
    if(!req.session.active) { 
     if(req.path == '/complete_signup') { 
      next(); 
     } else { 
      return res.redirect('/complete_signup');    
     } 
    } 
}); 

但這似乎並不奏效。我如何正確檢查用戶是否已被重定向?

如果您可以建議app.all()以外的方法,那也可以。

編輯:

在第二次看,這是工作,但沒有外部資源(樣式表,JavaScript的,等等)似乎加載,因爲它們不匹配req.path

+0

該示例將導致每個未經請求的請求轉到/ complete_signup。如果您使用的是靜態或靜態緩存,則可以將該中間件移動到高於路由中間件的位置,以便在app.all()有機會使用該文件之前對這些文件進行更改。 – 2012-01-12 18:26:14

+0

奇怪的是,您的外部資源未加載,因爲通常靜態中間件會在路由器之前運行。 – fent 2012-01-13 17:36:07

+0

DeaDEnd,路由器middlware在第一個app.get/post/delete/put/all時自動綁定。因此,如果他在建立其他中間件之前綁定路由,則路由器將成爲堆棧中的第一個。 – 2012-01-13 17:55:26

回答

1

您可以使用express-redirect-loop中間件(由於HTTP Referrer頭不可靠而使用會話)。這隻適用於支持cookie存儲/ jar(例如瀏覽器)的請求。

const express = require('express'); 
const session = require('express-session'); 
const redirectLoop = require('express-redirect-loop'); 

const app = express(); 

app.use(
    session({ 
    secret: 'test', 
    resave: false, 
    saveUninitialized: true 
    }) 
); 

app.use(redirectLoop()); 

app.get('/', (req, res) => res.sendStatus(200)); 
app.get('/bar', (req, res) => res.redirect('/foo')); 
app.get('/foo', (req, res) => res.redirect('/foo')); 
app.get('/baz', (req, res) => res.redirect('/bar')); 

app.listen(3000);