【问题标题】:Handling redirection in ExpressJS while avoiding redirect loop在 ExpressJS 中处理重定向,同时避免重定向循环
【发布时间】:2012-01-12 17:33:38
【问题描述】:

这是我第一次使用 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() 以外的方法,那也可以。

编辑:

再看一遍,这是可行的,但似乎没有加载任何外部资源(样式表、javascript 等),因为它们与 req.path 不匹配。

【问题讨论】:

  • 该示例将导致每个未经身份验证的请求都转到 /complete_signup。如果您使用的是 static 或 staticCache ,您可以将该中间件移动到比路由中间件更高的位置,以便在 app.all() 有机会吃掉它之前更改以提供这些文件。
  • 奇怪的是你的外部资源没有加载,因为通常静态中间件在路由器之前。
  • DeaDEnd,路由器中间件会自动绑定在第一个 app.get/post/delete/put/all 上。因此,如果他在设置其他中间件之前绑定路由,则路由器将是堆栈中的第一个。

标签: javascript node.js express


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 2011-11-24
    • 2011-08-14
    • 2015-05-23
    • 2012-02-10
    • 2015-06-17
    相关资源
    最近更新 更多