Nodejs TypeError: Cannot set property 'title' of undefined 为什么提示req.session.title 的title找不到?
Nodejs TypeError: Cannot set property ‘title’ of undefined 为什么提示req.session.title 的title找不到?
var express = require(‘express’);
var RedisStore = require(‘connect-redis’)(express);
var app=express();
app.configure(function () {
app.set(‘views’, __dirname + ‘/views’);
app.set(‘view engine’, ‘jade’);
app.set(‘view options’, {
layout: true
});
app.use(express.methodOverride());
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({
secret: ‘keyboard cat’,
store: new RedisStore()
}));
app.use(express['static'](__dirname + '/public'));
app.use(app.router);
});
require("./router")(app);
app.listen(process.env.PORT);
index.js
var index=function(req,res,next){
req.session.title="首页";
res.render('index',{
session:req.session
});
};
};
提示req.session.title=“首页”;TypeError: Cannot set property ‘title’ of undefined
根据你提供的代码片段,错误信息 TypeError: Cannot set property 'title' of undefined
表明 req.session
是 undefined
。这通常是因为会话中间件没有正确配置或使用。
以下是可能的原因及解决方案:
原因
- 会话中间件未加载:确保
express.session()
中间件已正确加载。 - RedisStore 配置问题:确保 RedisStore 正确配置并运行。
- 会话未初始化:确保每次请求时会话对象已被初始化。
解决方案
确保 express.session()
中间件正确配置,并且在路由处理函数中正确使用 req.session
。
示例代码
// server.js
var express = require('express');
var RedisStore = require('connect-redis')(express);
var app = express();
app.use(express.urlencoded({ extended: false })); // 支持 URL-encoded body
app.use(express.json()); // 支持 JSON body
app.use(express.methodOverride());
app.use(express.static(__dirname + '/public'));
app.use(express.session({
secret: 'keyboard cat',
store: new RedisStore(),
cookie: { maxAge: 60000 } // 设置会话过期时间(可选)
}));
app.use(function(req, res, next) {
if (!req.session.title) {
req.session.title = "默认标题"; // 确保会话对象已初始化
}
next();
});
app.get('/', function(req, res) {
req.session.title = "首页";
res.render('index', {
session: req.session
});
});
require("./router")(app);
app.listen(process.env.PORT || 3000, function() {
console.log("Express server listening on port %d in %s mode", this.address().port, app.settings.env);
});
解释
- 中间件顺序:确保所有中间件按正确的顺序加载。
- 检查会话初始化:在路由处理函数之前添加一个中间件来确保
req.session
已初始化。 - 设置默认值:如果
req.session.title
不存在,则设置一个默认值。
通过这种方式,你可以确保每次请求时 req.session
对象都存在,并且可以安全地设置和获取属性。
试试看
res.render(‘index’,{
session:req.session,
title : “首页”
});
};
不行,其实我们想问的是 req.session.xxx=“yyyyy” 就会提示错误,就算不render也会出错,
像var RedisStore = require('connect-redis')(express);
你是怎么用的?这里
app.use(express.cookieParser());
app.use(express.session({
secret: 'keyboard cat',
store: new RedisStore()
}));
怎么设置?我都是按照网上那样复制上去的,结果总是出错
调整一下use的顺序试一下,我的也遇到过这种问题,我的是把app.use(app.router);放到session之前就会undefined,之后就好了,具体为什么我还没追代码,你可以试下把bodyParser、cookie、session放到最前面
试下面:
redis-cli ping
有没有看到: PONG
?
这个是在cloud9 上放着
就是这个, 我也遇到楼主的问题, 这个回答能搞定. 太感谢了!
我也遇见了同样的问题,并且把session调到后面了,可是typeof req.session的时候还是undefined app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.static(path.join(__dirname, ‘public’))); app.use(express.cookieParser(‘keyboard’)); app.use(express.session({ secret: ‘blog’, key: ‘blog’, store:new RedisStore(), cookie: {maxAge: 1000 * 60 * 60 * 24 * 30}//30 days })); app.use(app.router);
然后在一个方法里想设req.session.flag的时候设不进去,后面输出下面信息的时候是undefind,求帮助~~ console.log(typeof req.session);
跟楼主一样的问题,现在解决了,网上的例子都是store:new RedisStore(),太坑了,其实它里面还里要写host跟post的,不然它根本连不上redis,改成store:new RedisStore({host:‘172.19.103.14’,port:‘6379’}),把里面的host跟post改成你自己的。
谢谢,为什么是这样呢?
根据你的描述,错误信息 TypeError: Cannot set property 'title' of undefined
表明 req.session
是 undefined
。这通常是因为会话中间件没有正确加载或配置。
在较新版本的 Express 中,express-session
和 cookie-parser
应该是单独安装并使用的中间件。以下是如何修改你的代码以确保正确加载这些中间件:
-
安装
express-session
和cookie-parser
:npm install express-session cookie-parser connect-redis
-
修改你的代码如下:
var express = require('express');
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
var cookieParser = require('cookie-parser');
var app = express();
app.use(cookieParser());
app.use(session({
secret: 'keyboard cat',
store: new RedisStore(),
resave: false,
saveUninitialized: false
}));
app.get('/index', function(req, res) {
req.session.title = "首页";
res.render('index', {
session: req.session
});
});
require("./router")(app);
app.listen(process.env.PORT || 3000);
解释
- 使用
cookieParser
: 在express-session
之前需要先使用cookie-parser
中间件。 - 正确配置
express-session
: 确保配置了resave
和saveUninitialized
参数。 - 检查路由: 确保你在访问
/index
路由时设置了req.session.title
。
通过以上步骤,你可以确保 req.session
不再为 undefined
,从而避免 TypeError
。