2012-01-12 58 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);