req.session 未定义和 req.session.user_id 不工作

Posted

技术标签:

【中文标题】req.session 未定义和 req.session.user_id 不工作【英文标题】:req.session undefined and req.session.user_id not working 【发布时间】:2014-02-01 08:18:42 【问题描述】:

我正在使用 Express 和 node 进行带有 https 的会话管理。我想使用 express 创建一个会话,以便在重定向到公用文件夹中的静态文件之前进行身份验证和会话。以前我遇到问题Trouble using express.session with https 但是通过将 express.session 中的路径包含为 /public 解决了这个问题,但现在我的 req.session 显示为未定义,但在浏览器中存在 connect.sid cookie

app.js 是:

var express = require('express')TypeError: Cannot set property 'user_id' of undefined at /opt/expressjs/app.js:59:24 at callbacks;
var http = require('http');
var https = require('https');
var fs = require('fs');
var mongo = require('mongodb');
var monk = require('monk');
var db = monk('localhost:27017/svgtest1');
var options = 
  key: fs.readFileSync('privatekey.pem'),
  cert: fs.readFileSync('certificate.pem')
;

var app = express();

app.use(express.static(__dirname + '/public'));
app.use(express.urlencoded());
app.use(express.json());
app.use(express.cookieParser());
app.use(express.session(cookie:   path: '/public/',httpOnly: false , maxAge: 24*60*60*1000, secret: '1234567890QWERT'));

//middle ware to check auth
function checkAuth(req, res, next) 
  if (!req.session.user_id) 
    res.send('You are not authorized to view this page');
   else 
    next();
  



app.get('/', function(req, res) 
  console.log('First page called');
  res.redirect('loginform.html');
  console.log('redirected');
  res.end();
);

app.post('/login', function(req, res) 
  console.log('login called');
  var usrfield = req.body.usrfield;
  var passfield = req.body.passfield;

    console.log(req.session);


// Play with the username and password

        if (usrfield == 'kk' && passfield == '123') 
             req.session.user_id = 'xyz';
        res.redirect('svg-edit.html');
       else 
        res.send('Bad user/pass');
      


        console.log(usrfield);
        console.log(passfield);
        res.end();
    );

客户端:

<html>

<style media="screen" type="text/css">
@import url("css/loginform_styles.css");
 </style>

    <head>
            <script type="text/javascript" src="annotationTools/js/md5.js" ></script>
            <script>

                function validateForm()
                
                    var usrnamefield=document.forms["loginform"]["usrfield"].value;
                    var passwrdfield=document.forms["loginform"]["passfield"].value;

                    if ((usrnamefield==null || usrnamefield=="")||(passwrdfield==null || passwrdfield==""))
                      
                        document.getElementById('valueerrorlayer').innerHTML ='Username or password field is empty';
                        //document.forms["loginform"]["errorshow"].innerHtml = 'username or password empty';
                      return false;
                      
                    else return true;
                
            </script>

    </head>

    <body>


    <form name="loginform" id="loginform" action="https://localhost:8888/login" method="post" onsubmit="return validateForm()">
        <div id = "content" align = "center">

            <p align="center"><font size="7">LabelMe Dev</font></p> 
            <br />
            <br />

            <label> Please Enter the <b><i>Username</i></b></label>
            <br />
            <br />

            <input type="text"  name = "usrfield" id = "usrfield" onkeydown="if (event.keyCode == 13) document.getElementById('btnSearch').click()"/>
            <br />
            <br />
            <br />

            <label> Please Enter the <b><i>Password</i></b></label>
            <br />
            <br />
            <input type="password"  name = "passfield" id = "passfield" onkeydown="if (event.keyCode == 13) document.getElementById('btnSearch').click()"/>
            <br />
            <br />
            <br />

            <i><p id='valueerrorlayer' style="color:red;"> </p></i>

            <input type="submit" value="Submit"/>
        </div>
    </form>     
    </body>





</html>

问题console.log(req.session); 给出 undefined 所以 req.session.user_id = 'xyz'; 也不起作用并且错误 'TypeError: Cannot set property 'user_id' of undefined at /opt/expressjs/app.js:59:24 at callbacks' 来了。 我经历了很多问题,但无法弄清楚。

我的网站是静态的,所有 *.html 都位于公共目录中

【问题讨论】:

【参考方案1】:

会话中间件检查传入请求是否与 cookie 路径匹配;如果没有,它不会打扰继续(并且req.session 甚至不会被创建)。在您的情况下,您的 cookie 路径设置为 /public/,与请求路径 /login 不匹配。

我认为您希望将会话中间件 cookie 配置为使用 / 作为路径:

app.use(express.session(
  cookie: 
    path    : '/',
    httpOnly: false,
    maxAge  : 24*60*60*1000
  ,
  secret: '1234567890QWERT'
));

【讨论】:

但是当我将路径转换为“/”时,会出现 Trouble using express.session with https 的问题,这意味着当我转到 localhost:8888 以获取“登录信息”时。 html' 浏览器不断加载,没有结果提示。 @Zeeshan 那么您在浏览器中输入的获取该 HTML 文件的确切 URL 是什么? 当我使用 :. var app = express(); app.use(express.static(__dirname + '/public')); app.use(express.favicon()); app.use(express.urlencoded()); app.use(express.json()); app.use(express.cookieParser()); app.use(app.router); app.use(express.methodOverride()); app.use(express.session( cookie: path : '/', httpOnly: false, maxAge : 24*60*60*1000 , secret: '1234567890QWERT' ));然后路由问题得到解决意味着我被重定向但在发布此错误时发生 TypeError: Cannot set property 'user_id' of undefined at /opt/expressjs/app.js:72:24 at callbacks @Zeeshan 之所以有效,是因为您正在规避 express.session 这样的中间件。我不知道为什么这会导致这个问题,因为它对我和回答你之前问题的人都有效。 可以使用 express.session 是在 express 3.4.7 中安装或其内置所需的任何先决条件,并且创建的 cookie connect.sid 具有一些值

以上是关于req.session 未定义和 req.session.user_id 不工作的主要内容,如果未能解决你的问题,请参考以下文章

比较未定义和错误的非常奇怪的行为

React 呈现未定义和更新的状态

检查jQuery中的未定义和空值

无法读取未定义和未处理的承诺拒绝的属性“捕获”

Vuex mapstate 对象未定义和“[vuex] 未知突变类型:”

Firefox 4 中的 JQuery 未定义和 $ 未定义错误 [关闭]