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


13 回复

根据你提供的代码片段,错误信息 TypeError: Cannot set property 'title' of undefined 表明 req.sessionundefined。这通常是因为会话中间件没有正确配置或使用。

以下是可能的原因及解决方案:

原因

  1. 会话中间件未加载:确保 express.session() 中间件已正确加载。
  2. RedisStore 配置问题:确保 RedisStore 正确配置并运行。
  3. 会话未初始化:确保每次请求时会话对象已被初始化。

解决方案

确保 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);
});

解释

  1. 中间件顺序:确保所有中间件按正确的顺序加载。
  2. 检查会话初始化:在路由处理函数之前添加一个中间件来确保 req.session 已初始化。
  3. 设置默认值:如果 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 上放着

看来,redis server没启动,不如用这个试看看:

app.use(express.cookieParser('your secret here'));
app.use(express.session());

就是这个, 我也遇到楼主的问题, 这个回答能搞定. 太感谢了!

我也遇见了同样的问题,并且把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改成你自己的。

谢谢,为什么是这样呢?

app.use(app.router);//注意这个放置的顺序很重要,不要放在session之前,要放在session之后,否则会提示cannot set property ‘’ of undefined

根据你的描述,错误信息 TypeError: Cannot set property 'title' of undefined 表明 req.sessionundefined。这通常是因为会话中间件没有正确加载或配置。

在较新版本的 Express 中,express-sessioncookie-parser 应该是单独安装并使用的中间件。以下是如何修改你的代码以确保正确加载这些中间件:

  1. 安装 express-sessioncookie-parser

    npm install express-session cookie-parser connect-redis
    
  2. 修改你的代码如下:

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

解释

  1. 使用 cookieParser: 在 express-session 之前需要先使用 cookie-parser 中间件。
  2. 正确配置 express-session: 确保配置了 resavesaveUninitialized 参数。
  3. 检查路由: 确保你在访问 /index 路由时设置了 req.session.title

通过以上步骤,你可以确保 req.session 不再为 undefined,从而避免 TypeError

回到顶部