【已解决】求助!Nodejs中req.session
【已解决】求助!Nodejs中req.session
在写 Node.js 开发指南中的例子, 当要往 MongoDM 中存放新用户时,报错:
TypeError: Cannot set property 'user' of undefined
代码中指向这行:
req.session.user = newUser;
在 app.js
中,中间件是这样设置的:
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({
secret: settings.cookieSecret,
store: new MongoStore({
db: settings.db
})
}));
app.use(app.router);
//app.use(express.router(routes))
app.use(express.static(__dirname + '/public'));
});
看起来像 session 中间件没有配对,但是又不知道哪里出了问题,求助!
根据你的描述,你遇到了一个 TypeError
,错误信息为 Cannot set property 'user' of undefined
。这个错误通常意味着你在尝试给一个未定义的对象设置属性。
分析问题
从你提供的代码片段来看,你在使用 Express 框架,并且已经配置了 session 中间件。问题出在 req.session.user = newUser;
这一行,这意味着 req.session
可能没有正确初始化或设置。
解决方案
- 确保 session 中间件顺序:确保
express.session()
中间件在路由处理之前被调用。 - 检查 session 存储配置:确保 MongoDB 存储配置正确无误。
示例代码
以下是一个完整的示例代码,展示如何正确配置和使用 session:
const express = require('express');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const app = express();
// 设置视图引擎和静态文件目录
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.static(__dirname + '/public'));
// 配置中间件
app.use(cookieParser());
app.use(session({
secret: 'your_secret_key',
resave: false,
saveUninitialized: true,
store: new MongoStore({
url: 'mongodb://localhost:27017/your_database_name'
})
}));
// 配置路由
app.get('/', (req, res) => {
req.session.user = { username: 'exampleUser' };
res.send('Session set successfully!');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
- 中间件顺序:确保
cookieParser()
和session()
在路由之前被调用。 - MongoDB 存储配置:确保
MongoStore
的配置正确,包括数据库 URL。 - 会话设置:
req.session
是一个对象,你可以直接设置属性如req.session.user
。
通过以上步骤,你应该能够解决 TypeError: Cannot set property 'user' of undefined
错误。如果问题仍然存在,请检查 MongoDB 是否正常运行并且可以连接。
console.log(newUser);//undefined
是这样吗
已经解决了.
app.use(express.session({
secret: settings.cookieSecret,
store: new MongoStore({
db: settings.db
})
}));
要写在
app.use(app.router);
之前.
我也碰到这个问题了, 原来真是顺序的问题, 谢谢楼主
根据你提供的信息,错误 TypeError: Cannot set property 'user' of undefined
表明 req.session
可能没有正确初始化。你需要确保在使用 req.session
之前已经成功设置了 session 中间件。
首先,确认你的 express-session
和 connect-mongo
包已经安装:
npm install express-session connect-mongo --save
然后,检查你的 app.js
文件,确保 session 中间件配置正确。以下是修改后的 app.js
示例:
var express = require('express');
var MongoStore = require('connect-mongo')(express);
var settings = {
cookieSecret: 'your_cookie_secret',
db: 'your_database_name'
};
var app = express();
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({
secret: settings.cookieSecret,
store: new MongoStore({
db: settings.db
})
}));
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
// 路由处理
app.post('/register', function(req, res) {
var newUser = { /* 新用户数据 */ };
req.session.user = newUser;
res.send('注册成功');
});
app.listen(3000);
如果 req.session
仍然为 undefined
,请确保在请求处理函数中正确加载了 session 中间件,并且请求路径在 app.use(app.router)
之后。
如果你使用的是较新的 Express 版本(4.x),请替换 express.session()
为 express-session
,并更新代码如下:
const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const settings = {
cookieSecret: 'your_cookie_secret',
db: 'your_database_name'
};
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(session({
secret: settings.cookieSecret,
store: new MongoStore({
db: settings.db
}),
resave: false,
saveUninitialized: true
}));
app.post('/register', (req, res) => {
const newUser = { /* 新用户数据 */ };
req.session.user = newUser;
res.send('注册成功');
});
app.listen(3000);
通过以上步骤,你应该能够正确地设置和使用 req.session
。