登录
注册
node.js 学习社区
Nodejs+Express判断session为空并重定向到登录界面问题

allen

2015-01-22 10:57

要求:登录时,user存放在session中,进入系统后,某些情况下session超时(比如重启服务)user为空,此时再点击页面某个连接请求时,我想直接跳转到登录界面。

问题:重启服务,再链接请求,user为空,res.redirect('/');不起作用,不会跳转到login页面,控制台500错误,(数据接口拿到user值为空,导致后台空指针异常),页面一直加载中。。。

代码贴上:(新手,三哥请指教,ths)


1:app.js
//路径解析
var routes=app.get("routes");
fs.readdirSync(routes).forEach(function(fileName) {
    var filePath = routes + fileName;
    var rname=fileName.substr(0,fileName.lastIndexOf("."));
    if(!fs.lstatSync(filePath).isDirectory()) {
        if(rname==="index"){
            app.use("/",require(filePath));
        }else if(rname==="reg"){
            app.use("/",require(filePath));
        }else if(rname==="personal"){
            app.use("/",require(filePath));
        }else{
            app.use("/"+rname,require(filePath));
        }
    }
});
//登录拦截器
app.use(function (req, res, next) {
    var url = req.originalUrl;
    console.log("url==="+url);
    var user = req.session.user;
    if(user){
        next();
    }else{
        res.redirect('/');
    }
});
2:login.js
var express = require('express'),
    router = express.Router(),
    TITLE_LOGIN = '登录',
    router = express.Router(),
    http = require('http'),
    qs = require('querystring'),
    async = require('async');

router.get('/', function(req, res) {
    res.render('login',{title:TITLE_LOGIN});//渲染页面 

});


回复 · 1

  • 通过代码分析,你在app.js 中使用 fs.readdirSync 可能是想实现动态路由的功能。

    你可能陷入了一个误区,认为 app.js 会在每次请求进来时调用,真实的情况是:app.js里的app初始化只应该运行一次,生成一个 express Application。而路由表的路径设定,也会随之固定,建议改写成这样的形式:

    var express = require('express');
    var app = express();
    
    //登录拦截器要在路由表之前
    app.use(function (req, res, next) {
        var user = req.session.user;
        if(user){
            next();
        }else{
            res.redirect('/login');
        }
    });
    
    //路由表中的路由可单独写到各个js里
    var index = require('./routes/index');
    var login = require('./routes/login');
    var reg = require('./routes/reg');
    var personal = require('./routes/personal');
    app.use('/', index);
    app.use('/login', login);
    app.use('/reg/', reg);
    app.use('/personal', personal);
    具体的单个路由,比如/routes/login.js可以写成这样:

    var express = require('express');
    var router = express.Router();
    
    router.route('/').get(function (req, res) {
        res.render('login', {title: '登录'});
    });
    
    module.exports = router;

    2

发表回复

你可以在回复中 @ 其他人