req.session未定义和req.session.user_id不工作 [英] req.session undefined and req.session.user_id not working

查看:275
本文介绍了req.session未定义和req.session.user_id不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



app.js是:

  var express = require('express')TypeError:无法设置属性'user_id' 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'}));

//中间件检查auth
函数checkAuth(req,res,next){
if(!req.session.user_id){
res.send ('您无权查看此页面');
} else {
next();
}
}


app.get('/',function(req,res){
console.log );
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);


//使用用户名和密码

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 =screentype =text / css>
@import url(css / loginform_styles.css);
< / style>

< head>
< script type =text / javascriptsrc =annotationTools / js / md5.js>< / script>
< script>

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

if((usrnamefield == null || usrnamefield ==)||(passwrdfield == null || passwrdfield ==))
{
document。 getElementById('valueerrorlayer')。innerHTML ='用户名或密码字段为空';
//document.forms[\"loginform\"][\"ourorshow\"].innerHtml ='用户名或密码为空';
return false;
}
else return true;
}
< / script>

< / head>

< body>


< form name =loginformid =loginformaction =https:// localhost:8888 / loginmethod =postonsubmit =return validateForm >
< div id =contentalign =centre>

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

< label>请输入< b>< i>用户名< / i>< / b>< / label&
< br />
< br />

< input type =textname =usrfieldid =usrfieldonkeydown =if(event.keyCode == 13)document.getElementById('btnSearch')。 />
< br />
< br />
< br />

< label>请输入< b>< i>密码< / i>< / b>< / label&
< br />
< br />
< input type =passwordname =passfieldid =passfieldonkeydown =if(event.keyCode == 13)document.getElementById('btnSearch')。
< br />
< br />
< br />

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

< input type =submitvalue =Submit/>
< / div>
< / form>
< / body>





< / html> c c req.session.user_id ='xyz'; 也不起作用,错误 'TypeError:不能设置属性'user_id'未定义在/opt/expressjs/app.js:59:24在callbacks'来了。
我已经经历了很多问题,但不能弄清楚。



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

解决方案

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



我想你想配置会话中间件cookie使用 / 作为路径:

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


I am using Express and node for the session management with https. I want to create a session using express so that authentication and the session is made before the redirection to the static files in the public folder. Previously i was having a problem Trouble using express.session with https But it was solved by including path in the express.session as /public but now my req.session is showing as undefined but in the browser there is connect.sid cookie present

The app.js is :

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();
    });

Client Side :

<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>

The problem is that console.log(req.session); gives undefined so the req.session.user_id = 'xyz'; also not works and error 'TypeError: Cannot set property 'user_id' of undefined at /opt/expressjs/app.js:59:24 at callbacks' comes. I have gone through many questions but was not able to figure out.

My website is static and all the *.html locates in the public directory

解决方案

The session middleware checks if an incoming request matches the cookie path; if not, it doesn't bother continuing (and req.session won't even be created). In your situation, your cookie path is set to /public/, which doesn't match the request path /login.

I think you'd want to configure the session middleware cookie to use / as a path:

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

这篇关于req.session未定义和req.session.user_id不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆