NodeJ中的中间件总是重定向到同一页面(我猜)

时间:2015-11-28 16:05:56

标签: 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现在称为仪表板,但是相同)。 一步一步

  1. 清除浏览器缓存并启动节点
  2. localhost:3000/ - >记录NOT LOGGED IN
  3. 登录并自动重定向到/dashboard - >记录REDIRECT TO DASHBOARD | Then get logged --> LOAD DASHBOARD`
  4. Try to enter in /new-product - >记录LOAD DASHBOARD

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

尝试向中间件添加额外参数 - 通常称为next。

基本上:

if(req.session.loggedIn == undefined)
        {
            res.set('Access-Control-Allow-Origin', '*');
            res.render('pages/login');
            console.log("NOT LOGGED IN");
        }
        else
        {
            next();
        }

然后:

shipment.requestXmlInformation { () -> () in
  dispatch_async(dispatch_get_main_queue(), { () -> Void in
        self.updateUi()
        print(self.statusLbl.text)
  })
}