node.js - NodeJs 中的中间件总是重定向到同一页面(我猜)

标签 node.js express middleware

我正在开发一个页面,以便使用 express 和 ejs 在 NodeJs 中学习。 在路由文件中,如果与 //login 匹配,则检查是否已登录。如果没有,则加载登录页面,否则加载管理页面。这个工作正常,我添加了另一个路由来重定向到其他一些页面。要检查是否已登录,我使用中间件 requireLoggedIn,这是我的代码:

var path = require("path");

module.exports = function (app) {
    app.get(/^\/$|^\/login$/,function(req,res){
        if(req.session.loggedIn == undefined)
        {
            res.set('Access-Control-Allow-Origin', '*');
            res.render('pages/login');
        }
        else
        {
            console.log("here")
            res.writeHead(301, {
                Location: '/admin'
            });
            res.end();
        }
    }).listen(3000);

    function requireLoggedIn(req, res, next) {
        if (!req.session || req.session.loggedIn === undefined) {
            res.writeHead(301, { 'Location': '/login' });
            res.end();
            return;
        }
        next();
    }

    app.get('/admin', requireLoggedIn, function(req,res){
        res.send('HERE WILL BE ADMIN PAGE');
    });

    app.get('/new-product', requireLoggedIn, function(req,res){
        res.render('pages/new-product');
    });
}

登录后,如果我想转到 /new-product,它总是重定向到 /admin。我认为这是我在第一条路线上的正则表达式的问题(因为这是唯一重定向到 /admin 的地方),但我添加了一个 console.log,并且在尝试加载时没有记录 /new-product 并加载 /admin。 删除中间件页面加载正常,所以我猜问题就在那里,但我看不出是哪个问题

我做错了什么?

编辑

清除浏览器缓存后,我可以正确加载到任何页面,但在第一次加载任何页面后,所有其他页面都会重定向到该页面。

编辑

我添加了更多代码和更多调试,以检查:

var path = require("path");

module.exports = function (app) {
    app.get(/^\/$|^\/login$/,function(req,res){
        console.log(req.session.loggedIn);
        if(req.session.loggedIn == undefined)
        {
            res.set('Access-Control-Allow-Origin', '*');
            res.render('pages/login');
            console.log("NOT LOGGED IN");
        }
        else
        {
            req.session.loggedIn = true;
            console.log("REDIRECT TO DASHBOARD")
            res.writeHead(301, {
                Location: '/dashboard'
            });
            res.end();
        }
    }).listen(3000);

    function requireLoggedIn(req, res, next) {
        if (!req.session || req.session.loggedIn === undefined) {
            res.writeHead(301, { 'Location': '/login' });
            res.end();
            return;
        }
        next();
    }

    app.get("/dashboard", requireLoggedIn, function(req,res){
        console.log('LOAD DASHBOARD');
        res.render('pages/dashboard');
    });

    app.get("/new-product", requireLoggedIn, function(req,res){
        console.log('LOAD NEW PRODUCT');
        res.render('pages/new-product');
    });
}

(/admin 现在叫做 dashboard,但是是一样的)。 循序渐进

  1. 清除浏览器缓存并启动 Node
  2. localhost:3000/ --> 登录 NOT LOGGED IN
  3. 登录并自动重定向到 /dashboard --> 登录并重定向到 DASHBOARD|然后记录 -->LOAD DASHBOARD`
  4. 尝试进入/new-product --> 获取日志 LOAD DASHBOARD

最佳答案

尝试切换到 302 重定向...301 重定向通常被缓存。

关于node.js - NodeJs 中的中间件总是重定向到同一页面(我猜),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33973407/

相关文章:

vue.js - 如何使用 Nuxt 中间件重定向到外部站点?

javascript - Node.js 在错误的文件路径上崩溃

javascript - Express.js : Get user's referer url when they post

node.js - 如何使用 Mocha 和 Istanbul 编写覆盖良好的测试用例?

node.js - 用于容器的 Azure Web 应用程序 - 启动期间失败 - 未响应 HTTP ping

node.js - Swagger JSDoc 不从子文件夹加载 API 文件

php - Laravel 中间件在路由中不起作用

javascript - Nodejs 和 Express 中的动态配置文件

node.js - 在 NodeJs 中安装 oracledb 时出错

javascript - 如何在不使用模板的情况下插入变量?