处理Express JS中的重定向,同时避免重定向循环

时间:2012-01-12 17:33:39

标签: javascript node.js express

这是我第一次使用Express'app.all()。当用户通过外部oAuth提供商注册时,我仍然需要他们在返回网站后提供电子邮件。我基本上是在数据库中将它们设置为非活动状态并检查req.session.active

我正在做的是

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

但这似乎不起作用。如何正确检查用户是否已被重定向?

如果您可以推荐除app.all()以外的方法,那也可以。

编辑:

第二眼看,这是有效的,但是由于它们与req.path不匹配,所以外部资源(样式表,javascripts等)似乎都没有加载。

1 个答案:

答案 0 :(得分: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);