节点js会话覆盖我的第一个会话

时间:2015-12-10 05:17:29

标签: javascript node.js session express

Hello guy是我在节点js中的新手我为多个用户创建了一个具有特定权限的演示应用程序。我的问题是当一个用户登录系统工作正常,但当其他用户在系统中登录同一服务器上的另一台计算机时,它会覆盖第一个用户权限。我不知道如何解决这个问题,我搜索谷歌和stackoverflow也没有什么请帮助我。 下面是我的登录和会话管理代码

    var express = require('express');
   var cookieParser = require('cookie-parser');
    var session = require('express-session');
   //app setup
  var app = express();
  //cookie parser
  app.use(cookieParser());
  //session 
  app.use(session({secret: '1234567890QWERTY',cookieName: 'session'  }));
        app.post('/users/loginAuthentication', function(req, res) {
                var query = req.body;
                var conditions = {email: query.username, password: query.password.toString(), is_delete: false, status: true};
                userModel.findOne(conditions, function(err, admins) {
                    if (err) {
                        console.log(err.message);
                    } else {
                        if (!admins) {
                            res.end('{"success" : "not login", "status" : 400, "Auth" : "Failed"}');
                        } else {
                            req.session.admin = admins;
                            app.locals.checkAuth = req.session.admin.user_roles;
                            app.locals.USERNAME = req.session.admin.user_name;
                            res.end('{"success" : "Updated Successfully", "status" : 200, "Auth" : "Success"}');
                        }
                    }
                });
            });

获取权限我在我的jade文件中做了类似的事情

if (checkAuth == 'ADMIN')
            li
              a(href='/data')
                i.fa.fa-plus-square-o.fa-fw
                |  table data

1 个答案:

答案 0 :(得分:2)

问题发生的原因是您在app.locals中存储数据,这些数据在应用程序的整个生命周期中都会持续存在。

看看以下几行:

app.locals.checkAuth = req.session.admin.user_roles;
app.locals.USERNAME = req.session.admin.user_name;

属性" checkAuth"和" USERNAME"将在那里停止您的应用程序(例如Ctrl + C)。

为了解决问题,您应该将这些属性存储在res.locals而不是app.locals中;

接下来的问题是如何传递它们来查看Jade?您可以尝试以下脚本(未测试!):

app.use(function(req, res, next){
  var render = res.render;
  var resLocals = res.locals;
  res.render = function(view, locals, cb){
    locals.checkAuth = resLocals.checkAuth;
    locals.USERNAME = resLocals.USERNAME;
    render.call(res, view, locals, cb);
  }
  next();
});

以上块作为常规ExpressJS中间件,在执行模板引擎行为之前将数据从res.locals复制到app.locals。

*增加:

会话数据应在请求 - 响应周期内的控制器中处理。在现实世界中,你应该做这样的事情:

// homeController.js

function index(req, res){

  var data = {
     checkAuth: req.session.user_roles;
     USERNAME: req.session.user_name;    
  }

  res.render('yourJadeTemplateFile', data); 
}