【发布时间】:2017-12-25 20:45:14
【问题描述】:
我尝试检查 Express 4 中的会话是否存在:
if(req.session.user == undefined) {}
它给了我错误:
Cannot read property 'user' of undefined
如何检查会话中是否存在值?
【问题讨论】:
我尝试检查 Express 4 中的会话是否存在:
if(req.session.user == undefined) {}
它给了我错误:
Cannot read property 'user' of undefined
如何检查会话中是否存在值?
【问题讨论】:
来自source:
如何使用快速会话?
在开始实际代码之前,我想先说几句 快速会话模块。要使用此模块,您必须包含 在你的项目中表达。像所有包裹一样,我们必须首先 包括它。
server.js var express = require('express'); var session = require('express-session'); var app = express();在此之后,我们必须初始化会话,我们可以通过 使用以下。
app.use(session({secret: 'ssshhhhh'}));这里的 ‘secret’ 用于 cookie 处理等,但我们必须放一些 在 Express 中管理 Session 的秘密。
现在使用“请求”变量,您可以将会话分配给任何变量。 就像我们在 PHP 中使用 $_SESSION 变量一样。例如
var sess; app.get('/',function(req,res){ sess=req.session; /* * Here we have assign the 'session' to 'sess'. * Now we can create any number of session variable we want. * in PHP we do as $_SESSION['var name']. * Here we do like this. */ sess.email; // equivalent to $_SESSION['email'] in PHP. sess.username; // equivalent to $_SESSION['username'] in PHP. });创建像 sess.email 这样的 Session 变量后,我们可以检查 该变量是否在其他路由器中设置并可以跟踪 会话轻松。
【讨论】:
首先,这取决于您使用的库,也许某些库有实用程序,我假设您使用的是express-session。
没关系:
if(req.session.user){}
它们没用:
if(typeof req.session.user !== "undefined"){}
if(typeof req.session.user !== "undefined" || req.session.user === true){}
原因:req.session是一个对象,和普通对象一样:
var obj = { name : "adam" }
如果您尝试获取它不存在且未定义的 obj.age, 对象的getter函数,首先检查它是否存在,如果不存在,则不会产生致命错误,而是将该属性分配给未定义值。
这很酷,所以obj.age 得到了 undefined (JS 有undefined 作为值类型),而且undefined 是一个假值(当你强制它为布尔值时,它变成了假,所以它是假的),这意味着你可以简单地在这样的条件语句中检查它:if(obj.age){}
【讨论】:
你不能只创建一个没有任何中间件的会话(我假设这是你尝试过的)。
阅读 express-session 中间件文档,可在此处找到:
https://github.com/expressjs/session
基本实现示例:
创建会话:
app.use(session({
genid: function(req) {
return genuuid() // use UUIDs for session IDs
},
secret: 'keyboard cat'
}))
阅读会话:
// Use the session middleware
app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))
// Access the session as req.session
app.get('/', function(req, res, next) {
var sess = req.session
if (sess.views) {
sess.views++
res.setHeader('Content-Type', 'text/html')
res.write('<p>views: ' + sess.views + '</p>')
res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>')
res.end()
} else {
sess.views = 1
res.end('welcome to the session demo. refresh!')
}
})
您可以在网上找到许多教程,例如:
https://www.thepolyglotdeveloper.com/2015/01/session-management-expressjs-web-application/
【讨论】:
您面临的问题可能是您没有在所有请求中使用会话中间件。 您可以通过以下方式查看:
app.use(session({ secret: 'keyboard cat',resave:false,saveUninitialized:false, cookie: { maxAge: 60000 }}));
router.post('/', function(req, res, next) {
//login logic here
//if login successfull
req.session.user = username //your unique identifier
req.send("Hurray! logged in");
//else
req.send("Credentials error");
});
router.get('/dashboard', function(req, res, next) {
if (req.session.user)
//do stuff here
else
//redirect to login page
})
这行得通:)
【讨论】: